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

时间:2019-03-26 20:21:51

标签: c parsing gps

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

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

sequelize

预期会看到非空字段,例如:+4916.4600 / -12311.1200(这只是一个示例,因为我现在什么都没看到)。

1 个答案:

答案 0 :(得分:0)

希望这还不算晚。
这个想法是: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;
}  

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