I have written some C/C++ code including this NMEA library to parse data incoming from a gps device.
#include <iostream>
#include <string>
#include <sstream>
#include <cstring>
#include <thread>
#include <nmea/nmea.h>
#include "GPSDevice.h"
using namespace std;
bool debugverbose = true;
void debug(string message) {
if(debugverbose)
cout << "[ DEBUG ] " << message << endl;
}
bool errorverbose = true;
void error(string message) {
if(errorverbose)
cout << "[ ERROR ] " << message << endl;
exit(-1);
}
GPSDevice gpsDevice;
nmeaINFO nmeainfo;
nmeaPARSER nmeaparser;
nmeaPOS nmeapos;
void nmeatrace(const char *str, int str_size) {
printf("[ NMEA TRACE ] ");
write(1, str, str_size);
printf("\n");
}
void nmeaerror(const char *str, int str_size) {
printf("[ NMEA ERROR ] ");
write(1, str, str_size);
printf("\n");
}
int main(int argc, char *argv[]) {
// open gps device
debug("opening gps device");
GPSDevice gpsDevice("/dev/ttyO3");
if(!(gpsDevice.openport()))
error("gpsDevice.openport()");
// set up nmea parser
debug("setting up nmea parser");
nmea_property()->trace_func = &nmeatrace;
nmea_property()->error_func = &nmeaerror;
nmea_zero_INFO(&nmeainfo);
nmea_parser_init(&nmeaparser);
// read nmea data
debug("reading nmea data");
for(;;) {
string data = gpsDevice.readline();
debug(data);
// nmea_parser expects \r\n
data += "\r\n";
// parse nmea data
nmea_parse(&nmeaparser, data.c_str(), (int) strlen(data.c_str()), &nmeainfo);
// get position
nmea_info2pos(&nmeainfo, &nmeapos);
cout << "Lat: " << nmeapos.lat << endl;
cout << "Lon: " << nmeapos.lon << endl;
}
// destroy parser
debug("destroying parser");
nmea_parser_destroy(&nmeaparser);
// close gps device
debug("closing gps device");
gpsDevice.closeport();
return 0;
}
The gpsDevice
successfully reads the incoming data, but after parsing it, the nmeaINFO object is still empty. I attached an excerpt of my program's output.
[ DEBUG ] opening gps device
[ DEBUG ] setting up nmea parser
[ DEBUG ] reading nmea data
[ DEBUG ] $GPGGA,132431.000,5222.8791,N,01032.3533,E,1,11,0.78,84.2,M,46.9,M,,*56
Lat: 0
Lon: 0
[ DEBUG ] $GPGSA,A,3,13,07,23,16,08,09,20,29,10,04,02,,1.07,0.78,0.73*03
Lat: 0
Lon: 0
[ DEBUG ] $GPRMC,132431.000,A,5222.8791,N,01032.3533,E,0.55,318.66,010214,,,A*62
Lat: 0
Lon: 0
[ DEBUG ] $GPVTG,318.66,T,,M,0.55,N,1.01,K,A*37
Lat: 0
Lon: 0
[ DEBUG ] $GPGGA,132432.000,5222.8787,N,01032.3540,E,1,11,0.78,84.0,M,46.9,M,,*54
Lat: 0
Lon: 0
...
I hope you can help me.
Edit(working sample code):
/* gpslog.txt */
$PSRFTXTVersion GSW3.2.1PAT_3.1.00.12-SDK001P1.00c *3F
$PSRFTXTHTC GPS_ART_321000_GEN*20
$PSRFTXTTOW: 258712*32
$PSRFTXTWK: 1412*4F
$PSRFTXTPOS: 1518885 -4470072 4274168*24
$PSRFTXTCLK: 94817*02
$PSRFTXTCHNL: 12*5F
$PSRFTXTBaud rate: 57600 *51
$GPGGA,213638.949,,,,,0,00,,,M,0.0,M,,0000*5F
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,213638.949,V,,,,,,,010207,,,N*40
$GPGGA,213639.897,,,,,0,00,,,M,0.0,M,,0000*5C
...
/* nmealib/samples/parse_file/main.c */
#include <nmea/nmea.h>
#include <string.h>
#include <stdio.h>
#ifdef NMEA_WIN
# include <io.h>
#endif
void trace(const char *str, int str_size)
{
printf("Trace: ");
write(1, str, str_size);
printf("\n");
}
void error(const char *str, int str_size)
{
printf("Error: ");
write(1, str, str_size);
printf("\n");
}
int main()
{
nmeaINFO info;
nmeaPARSER parser;
FILE *file;
char buff[2048];
int size, it = 0;
nmeaPOS dpos;
file = fopen("gpslog.txt", "rb");
if(!file)
return -1;
nmea_property()->trace_func = &trace;
nmea_property()->error_func = &error;
nmea_zero_INFO(&info);
nmea_parser_init(&parser);
/*
while(1)
{
*/
while(!feof(file))
{
size = (int)fread(&buff[0], 1, 100, file);
nmea_parse(&parser, &buff[0], size, &info);
nmea_info2pos(&info, &dpos);
printf(
"%03d, Lat: %f, Lon: %f, Sig: %d, Fix: %d\n",
it++, dpos.lat, dpos.lon, info.sig, info.fix
);
}
fseek(file, 0, SEEK_SET);
/*
}
*/
nmea_parser_destroy(&parser);
fclose(file);
return 0;
}