c++ - NMEA 库 - nmeaINFO 为空

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

最佳答案

代码本身没有问题。我已将 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 并且您 printf \n 另外,一共有两个行尾。行尾的差异让我怀疑您的字符串被错误地解析为您特定的 nmealib 构建/版本。尝试从源代码重建 nmea 库并添加额外的调试信息。

关于c++ - NMEA 库 - nmeaINFO 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21498838/

相关文章:

c++ - 在 mac os 上创建临时文件时出错

.net - 如何将这些图像 EXIF GPS 坐标转换为十进制经纬度?

c++ - 编译错误 'nullptr' 未声明的标识符

类对象的 std::vector 的 C++ 析构函数问题

c++ - 如何使用 Savitzky-Golay 平滑系数计算导数

c++ - 将数字乘以矩阵

c++ - C中关于除以零的一些事情

c - 改变结构的大小?

c# - 开发GPS汽车跟踪系统

Android 的 LocationManager 忽略 requestLocationUpdates 调用中的更改,但仅在 Droid 上