我正在使用旧设备(2006年-极度修剪的嵌入式Linux)从外部接收器获取GPS纬度和经度。 GPS坐标显示在设备的LCD显示屏上。在原始GPS接收器出现故障之前,它一直可以正常工作。他们用一个新的接收器代替了它,但是现在它不再工作了,我在LCD上看到的只是:纬度:-/经度:-。
我试图查看新的GPS接收器是否可以运行。似乎那里有GPGGA数据包。旧设备需要GPGGA数据包进行解析/处理。
sequelize
预期会看到非空字段,例如:+4916.4600 / -12311.1200(这只是一个示例,因为我现在什么都没看到)。
答案 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;
}
我很确定这可以解决您的问题:)