NMEA library - nmeaINFO empty

六眼飞鱼酱① 提交于 2019-12-24 10:55:30

问题


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

回答1:


There is nothing wrong with the code itself. I've replaced the gpsDevice.readline() with a constant string from your output, and I get the following:

[ DEBUG ] opening gps device
[ DEBUG ] setting up nmea parser
[ DEBUG ] reading nmea data
[ 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
Lon: 0.183944

Notice that there are additional line ends in my output which are missing in yours. The GPS string has \r\n appended and you printf \n in addition, total of two line endings. The difference in line endings makes me suspicious that your string is wrongly parsed with your particular build/version of nmealib. Try rebuilding the nmea library from source and add additional debugging info.



来源:https://stackoverflow.com/questions/21498838/nmea-library-nmeainfo-empty

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!