NMEA报文解析程序(c语言)-命令解析
程序员文章站
2022-07-12 21:56:22
...
开发工具:DEV
NMEA协议基础知识可参见:GPS理论知识NMEA 0813协议
为完成课程设计而参照网上例子,按照课程要求修改而来
1、在搜集资料过程中发现网上很多都不完整,而且有的会有很多小错误,无法有效运行,自己调试后做了一些修改,能成功运行。
2、因为是上个学期的作业,有些细节不太记得了,但是代码里有修改的地方我都有注释,大家可以参照这些代码段根据自己的需求构建程序。
3、完整工程可以私信我,留下邮箱,看到就会第一时间发送。 加上网盘链接吧,里面还附了DEV(免安装的)
baidu链接
提取码:axpl
4、有错误的地方也希望大家能够指正。
系列四:命令解析
根据自己的需要解析不同报文,我需要同时提取时间和经纬度,用到了GPRMC,先贴出它的解析,其他报文可在工程中查看
u8 *NMEA_GPRMC_Analysis(Nmea_msg *gpsx,u8 *buf)
{
u8 *p1, *node;
u8 posx;
u32 temp;/*32位变量读取时间数据*/
float rs;
if(strlen((char*)buf) == 0)
{
return buf;
}
p1 = (u8*)strnstr((char *)buf, "$GPRMC", 6);
if (p1 == NULL)
{
return buf;
}
posx = NMEA_Comma_Pos(p1, 1);/*UTC时间*/
if (posx != 0XFF)
{
temp = NMEA_Str2num(p1 + posx) / NMEA_Pow(10, 2);/*UTC时间,hhmmss.ss去掉ms*/
// gpsx->utc.hour = temp / 10000;
gpsx->utc.hour = temp / 10000+8; //转换为北京时间
gpsx->utc.mint = (temp / 100) % 100;
gpsx->utc.sec = temp % 100;
}
posx = NMEA_Comma_Pos(p1, 2);/*有无效用定位*/
if (posx != 0XFF)gpsx->avhemi = *(p1 + posx);
posx = NMEA_Comma_Pos(p1, 3);/*纬度 ddmm.mmmm(度分)*/
if (posx != 0XFF)
{
temp = NMEA_Str2num(p1 + posx); /*ddmm.mmmmm*/
gpsx->latitude = temp / NMEA_Pow(10, 7); /*得到°*/
rs = (temp / 10000) % 100; /*得到'*/
gpsx->latitude = gpsx->latitude + rs / 60;/*转换为°*/
}
posx = NMEA_Comma_Pos(p1, 4);/*南北纬*/
if (posx != 0XFF)gpsx->nshemi = *(p1 + posx);
posx = NMEA_Comma_Pos(p1, 5);/*经度*/
if (posx != 0XFF)
{
temp = NMEA_Str2num(p1 + posx); /*dddmm.mmmmm*/
gpsx->longitude = temp / NMEA_Pow(10, 7); /*得到°*/
rs = (temp / 10000) % 100; /*得到'*/
gpsx->longitude = gpsx->longitude + rs / 60;/*转换为°*/
}
posx = NMEA_Comma_Pos(p1, 6);/*东西经*/
if (posx != 0XFF)gpsx->ewhemi = *(p1 + posx);
posx = NMEA_Comma_Pos(p1, 7);/*地面速率(航节)*/
if (posx != 0XFF)
{
temp = NMEA_Str2num(p1 + posx);
gpsx->speed = (float)temp / 1000 * 1.852;
}
posx = NMEA_Comma_Pos(p1, 8);/*地北航向角度*/
if (posx != 0XFF)gpsx->entude = NMEA_Str2num(p1 + posx);
posx = NMEA_Comma_Pos(p1, 9);/*UTC日期*/
if (posx != 0XFF)
{
temp = NMEA_Str2num(p1 + posx);
gpsx->utc.date = temp / 10000;
gpsx->utc.month = (temp / 100) % 100;
gpsx->utc.year = 2000 + temp % 100;
}
posx = NMEA_End_Pos(p1);/*12*/
node = p1 + posx + 1;
return node;
}
上一篇: java 解析8583 报文