欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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;
}