NMEA库 - nmeaINFO空

时间:2014-02-01 13:49:41

标签: c++ c gps nmea

我编写了一些C / C ++代码,包括this NMEA library来解析从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 个答案:

答案 0 :(得分:0)

代码本身没有任何问题。我已经用输出中的常量字符串替换了gpsDevice.readline(),我得到以下内容:

[ 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

请注意,我的输出中还有其他行结束,这些行结尾在您的输出中丢失。 GPS字符串附加了\r\n,另外您还打印了\n,共有两个行尾。行结尾的差异让我怀疑你的字符串是否被你的特定构建版本的nmealib错误地解析了。尝试从源代码重建nmea库并添加其他调试信息。