1

我已经编写了一些 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;
}
4

1 回答 1

0

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

[调试] 打开 GPS 设备
[调试] 设置 nmea 解析器
[调试] 读取 nmea 数据
[调试] $GPRMC,132431.000,A,5222.8791,N,01032.3533,E,0.55,318.66,010214,,,A*62

[ NMEA 跟踪 ] $GPRMC,132431.000,A,5222.8791,N,01032.3533,E,0.55,318.66,010214,,,A*62

纬度:0.914226
朗:0.183944

请注意,我的输出中还有其他行尾,而您的输出中缺少这些行尾。GPS 字符串已\r\n附加,您还 printf \n,总共有两个行尾。行尾的差异使我怀疑您的字符串被错误地解析为您的特定构建/版本的 nmealib。尝试从源代码重建 nmea 库并添加额外的调试信息。

于 2014-02-07T10:24:12.883 回答