Библиотека NMEA — nmeaINFO пусто

Я написал некоторый код C / C ++, включая эта библиотека NMEA проанализировать данные, поступающие с устройства GPS.

#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;
}

gpsDevice успешно читает входящие данные, но после их анализа объект nmeaINFO по-прежнему пуст. Я приложил выдержку из вывода моей программы.

[ 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
...

Я надеюсь, что вы можете мне помочь.

Редактировать (рабочий пример кода):

/* 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;
}

1

Решение

В самом коде нет ничего плохого. Я заменил gpsDevice.readline() с константой строки из вашего вывода, и я получаю следующее:

[DEBUG] открытие устройства GPS
[DEBUG] настройка парсера nmea
[DEBUG] чтение данных nmea
[DEBUG] $ GPRMC, 132431.000, A, 5222.8791, N, 01032.3533, E, 0.55.318.66,010214 ,,, A * 62

[NMEA TRACE] $ GPRMC, 132431.000, A, 5222.8791, N, 01032.3533, E, 0.55.318.66,010214 ,,, A * 62

Lat: 0,914226
Долг .: 0.183944

Обратите внимание, что в моем выводе есть дополнительные концы строк, которых нет в вашем. Строка GPS имеет \r\n добавлен и вы printf \n Кроме того, всего два окончания строки. Разница в окончаниях строк вызывает у меня подозрение, что ваша строка неверно проанализирована с вашей конкретной сборкой / версией nmealib. Попробуйте перестроить библиотеку nmea из исходного кода и добавить дополнительную информацию об отладке.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]