我正在使用一台旧设备(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/