AVR代码,用于将GPS坐标转换为NMEA格式
AVR code for converting GPS coordinates to NMEA format
我制作了一个Android应用程序,可以从GPS中获取数据并发送。它由PC拾取,并通过USB发送到AVR套件,该套件需要将经度、纬度格式转换为NMEA格式,然后返回到USB。消息格式为:
纬度='23.353434333',经度='45.34333345'
我需要使用ATmega32将上述消息转换为NMEA GPS格式,但由于我不知道AVR编程,有人能建议我如何做到这一点吗?
您没有AVR编程经验与实现NMEA无关。但是知道C会有所帮助;)
您的给定表示纬度='23.353434333',经度='45.34333345'称为十进制度数(您的示例缺少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.0131006,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十进制小数度数值转换为度/分/秒第一将十进制十进制值转换为十进制:5144.385(ddmm.mmm)=51 44.3855=51+44.3855/60=51.7397583度
然后将小数转换为度,分-秒:51度+0.7397583*60=44.385498=44分钟.385498=23.1秒结果:51 44’23.1"
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 是否可以从int转换为enum类类型
- 了解 GLM- openGL 中的相机转换
- AVR代码,用于将GPS坐标转换为NMEA格式