我做了一个Android应用程序,从GPS获取数据并发送。它由aPC拾取,并通过USB发送到AVR套件,它需要将经度,纬度格式转换为NMEA格式并将其返回到USB。消息格式为:纬度='23.353434333'和经度='45.34333345'我需要使用ATmega32将上述消息转换为NMEA GPS格式,但由于我不知道AVR编程,有人可以建议我如何做或上面的代码?
nkoocmlb1#
你没有AVR编程的经验与实现NMEA无关。)您给出的表示 latitude ='23.353434333' and 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协议需要额外阅读一些关于实现细节的内容。
rn0zuynd2#
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 }
ktecyv1j3#
将NMEA十进制-十进制度值转换为度/分/秒首先,将十进制-十进制值转换为十进制: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”
3条答案
按热度按时间nkoocmlb1#
你没有AVR编程的经验与实现NMEA无关。)
您给出的表示 latitude ='23.353434333' and 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协议需要额外阅读一些关于实现细节的内容。
rn0zuynd2#
ktecyv1j3#
将NMEA十进制-十进制度值转换为度/分/秒首先,将十进制-十进制值转换为十进制: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”