我制作了一个 Android 应用程序,它从 GPS 获取数据并发送。它由 PC 接收,并通过 USB 发送到 AVR 套件,AVR 套件需要将经度、纬度格式转换为 NMEA 格式并将其返回到 USB。消息格式为:
纬度='23.353434333' 和经度='45.34333345'
我需要使用 ATmega32 将上述消息转换为 NMEA GPS 格式,但由于我不知道 AVR 编程,有人可以建议我如何做或上面的代码吗?
您没有 AVR 编程经验与实施 NMEA 无关。然而,了解 C 会有所帮助;)
您给定的表示形式 latitude='23.353434333' 和 longitude='45.34333345' 称为 decimal degrees(您的示例缺少 N/S 和 E/W 指示)。
我假设您知道 NMEA 是一种协议规范,而不仅仅是一种坐标格式。 NMEA 标准在数据集中使用以下坐标表示法:
XXYY.ZZZZ
这可以直接用度分秒这样的格式来表示:
XX°YY'(0.ZZZZ * 60)"
所以两者之间的转换是微不足道的,还有从度分秒到十进制度的转换:
十进制度数 = 度 + 分/60 + 秒/3600
所以本质上你只需要反向执行给定的转换,你就可以得到你的 NMEA 坐标格式。
NMEA 数据集如下所示:
$GPRMC,162614,A,5230.5900,N,01322.3900,E,10.0,90.0,131006,1.2,E,A*13
我用粗体突出了坐标信息。实施转换没什么特别的,而实施 NMEA 协议需要额外阅读实施细节。
void Convert_NMEA_Decimal(void)
{
char CDD[3] = {};
char CSS[7] = {};
float DD = 0.0;
float SS = 0.0;
float LatDec = 0.0;
float LogDec = 0.0;
//convert Latitude from NMEA DDSS.SSSS to decimal
CDD[0] = gnss1.latitude[0]; CDD[1] = gnss1.latitude[1]; //Separete DD from DDSS.SSSS
CSS[0] = gnss1.latitude[2]; CSS[1] = gnss1.latitude[3]; CSS[2] = gnss1.latitude[4]; //Separete SS.SSSS from DDSS.SSSS
CSS[3] = gnss1.latitude[5]; CSS[4] = gnss1.latitude[6];
CSS[5] = gnss1.latitude[7]; CSS[6] = gnss1.latitude[8];
DD = strtod(CDD,NULL); //Convert CDD string to float (DD)
SS = strtod(CSS,NULL); //Convert CSS string to float (SS)
LatDec = (DD + (SS/60)); //Convert for NMEA to Decimal
// if(gnss1.latitude[9] == 'N')
// {
// LatDec = LatDec * -1;
// }
//convert Longitude from NMEA DDDSS.SSSS to decimal
CDD[0] = gnss1.longitude[0]; CDD[1] = gnss1.longitude[1]; CDD[2] = gnss1.longitude[2]; //Separete DDD from DDSS.SSSS
CSS[0] = gnss1.longitude[3]; CSS[1] = gnss1.longitude[4]; CSS[2] = gnss1.longitude[5]; //Separete SS.SSSS from DDSS.SSSS
CSS[3] = gnss1.longitude[6]; CSS[4] = gnss1.longitude[7];
CSS[5] = gnss1.longitude[8]; CSS[6] = gnss1.longitude[9];
DD = strtod(CDD,NULL); //Convert CDD string to float (DD)
SS = strtod(CSS,NULL); //Convert CSS string to float (SS)
LogDec = (DD + (SS/60)); //Convert for NMEA to Decimal
if(gnss1.longitude[10] == 'S' || gnss1.longitude[10] == 'W') //if longitude S or W Latitude x -1
{
LogDec = LogDec * -1;
}
snprintf(gnss1.latitude, 10, "%f", LatDec); //Convert Float Latitude to String
snprintf(gnss1.longitude, 11, "%f", LogDec);//Convert Float Longitude to String
}
将 NMEA 十进制度数度值转换为度/分/秒 第一的。将 decimal-decimal 值转换为十进制: 5144.3855 (ddmm.mmmm) = 51 44.3855 = 51 + 44.3855/60 = 51.7397583 度
然后将小数转换为度、分秒: 51 度 + .7397583 * 60 = 44.385498 = 44 分钟 .385498 = 23.1 秒 结果:51 44' 23.1"