c - GPS 解析器功能不适用于新接收器

标签 c parsing gps

我正在使用一台旧设备(2006 年 - 极其精简的嵌入式 Linux)从外部接收器获取 GPS 纬度和经度。 GPS 坐标显示在设备的 LCD 显示屏上。它曾经工作正常,直到原来的 GPS 接收器出现故障。他们用新的接收器替换了它,但现在它不再工作了,我在 LCD 上看到的只是:纬度:-/经度:-。

我尝试查看新的 GPS 接收器是否可以运行。看来 GPGGA 数据包就在那里。旧设备需要 GPGGA 数据包进行解析/处理。

char GPSLatBuf[12], GPSLonBuf[12];

int parseGPSData(char * gpsBuffer)
{
  char * p;
  char gpsQuality = '0';

  if((p = strstr(gpsBuffer, "$GPGGA")) == NULL)
     return -1;

  memset(GPSLatBuf, 0, sizeof(GPSLatBuf));
  memset(GPSLonBuf, 0, sizeof(GPSLonBuf));

  p += 7; // UTC time
  if(*p != ',') 
  {
     p += 10; // Latitude
     if(*p != ',') 
     {
        memcpy(&GPSLatBuf[1], p, 9);
        p += 10; // N/S Hemisphere
        if(*p != ',') 
        {
           GPSLatBuf[0] = (*p == 'N') ? '+' : '-';
           p += 2; // Longitude
           if(*p != ',') 
           {
              memcpy(&GPSLonBuf[1], p, 10);
              p += 11; // E/W Hemisphere
              if(*p != ',') 
              {
                 GPSLonBuf[0] = (*p == 'E') ? '+' : '-';
                 p += 2; // GPS quality
                 if(*p != ',')
                    gpsQuality = *p;
              }
           }
        }
     }
  }
  if(gpsQuality == '0')
     return -1;

  return 0;
}

预计会像以前一样看到非空字段:+4916.4600/-12311.1200(这只是一个示例,因为我现在没有看到任何显示)。

最佳答案

希望这还不算太晚。
这个想法是:GPGGA 消息内数据的十进制位数* 在某种程度上是特定于 GPS 模块的。
因此,您的代码在这里有一个问题,因为它使用固定偏移量来搜索纬度、经度等。
解决这个问题很容易:您应该使用 strstr() 函数搜索分隔符(在本例中为“,”),而不是使用固定偏移量。
这是更正后的代码:

int parseGPSData(char * gpsBuffer)
{
  char * p;
  char gpsQuality = '0';

  if((p = strstr(gpsBuffer, "$GPGGA")) == NULL)
     return -1;

  memset(GPSLatBuf, 0, sizeof(GPSLatBuf));
  memset(GPSLonBuf, 0, sizeof(GPSLonBuf));

  if((p = strstr(p, ",")) != NULL)
  {
      p++; // there is UTC time
      if((p = strstr(p, ",")) != NULL)
      {
          p++; // Latitude
          memcpy(&GPSLatBuf[1], p, 9);
          if((p = strstr(p, ",")) != NULL)
          {
              p++; // N/S Hemisphere
              GPSLatBuf[0] = (*p == 'N') ? '+' : '-';
              if((p = strstr(p, ",")) != NULL)
              {
                  p++; // Longitude
                  memcpy(&GPSLonBuf[1], p, 10);
                  if((p = strstr(p, ",")) != NULL)
                  {
                      p++; // E/W Hemisphere
                      GPSLonBuf[0] = (*p == 'E') ? '+' : '-';
                      if((p = strstr(p, ",")) != NULL)
                          gpsQuality = p[1];
                  }
              }
          }
      }
  }

  if(gpsQuality == '0')
     return -1;

  return 0;
}  

我很确定这会解决您的问题:)

<小时/>

*编辑:
NMEA GGA 消息如下所示 - 示例:

$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47

where:  
##     GGA          Global Positioning System Fix Data  
##     123519       Fix taken at 12:35:19 UTC  
##     4807.038,N   Latitude 48 deg 07.038' N  
##     01131.000,E  Longitude 11 deg 31.000' E  
##     ...  

您可以在这里找到更多有用的信息:https://www.gpsinformation.org/dale/nmea.htm#GGA

关于c - GPS 解析器功能不适用于新接收器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55365638/

相关文章:

c - 与 aio_context 关联的资源

c++ - 错误 : sys/wait. h:没有那个文件或目录

Android 模拟位置提供程序未从 LocationManager 中清除

parsing - 如何改进语法错误报告?

c++ - 灵气中如何在字符串属性开头插入一个字符

android - 谷歌地图未在手机上显示但可在模拟器上使用

android - 预期的 Android GPS 准确度

c - 数字末尾有和没有 "u"的宏常量

c - 使用 USB2 连接的 ext2 卷改善小文件读取时间

java - 在 Android 中解析 HTML