ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

NMEA报文解析程序(c语言)- 数据包判断

2020-06-12 18:39:59  阅读:602  来源: 互联网

标签:Str2num u8 报文 state step NMEA date 数据包


开发工具:DEV
NMEA协议基础知识可参见:GPS理论知识NMEA 0813协议

为完成课程设计而参照网上例子,按照课程要求修改而来

1、在搜集资料过程中发现网上很多都不完整,而且有的会有很多小错误,无法有效运行,自己调试后做了一些修改,能成功实现功能。
2、因为是上个学期的作业,有些细节不太记得了,但是代码里有修改的地方我都有注释,大家可以参照这些代码段根据自己的需求构建程序。
3、完整工程可以私信我,留下邮箱,看到就会第一时间发送。 加上网盘链接吧,里面还附了DEV(免安装的)
baidu链接
提取码:axpl
4、有错误的地方也希望大家能够指正。

系列一:读报文
系列二:解析报文

系列三:数据包判断

这段是判断数据包是否有效,根据有效时间来判断新
包和旧包,旧包将抛弃


int Package(char *state)
{
    int signal;
    static u32 time;
    static u32 date;
    static u32 htime;
    static u32 hdate;
    static int avail = 0;/*数据包有效性*/
    static int packg = 0;/*封包标志*/
    u8 step;
    //只在有时间日期信息的报文中提取
 //有的报文中是 GNRMC,有的是 GPRMC,根据手机收集的报文信息做修正 
    //原为$GNRMC,修正为 "$GPRMC"
    if(strstr(state,"$GPRMC"))
    {
        step = NMEA_Comma_Pos((u8*)state, 1);
        time = NMEA_Str2num((u8*)state + step) / 100; //hhmmss.ss 
        step = NMEA_Comma_Pos((u8*)state, 9);
        date = NMEA_Str2num((u8*)state + step); //ddmmyy
    }
    if(strstr(state,"$GNVTG"))
    {
 
    }
        //原为$GNGGA,修正为 "$GPGGA"
    //根据自己采集的数据形式选择 
    if(strstr(state,"$GPGGA"))
    {
        step = NMEA_Comma_Pos((u8*)state, 1);
        time = NMEA_Str2num((u8*)state + step) / 100; //hhmmss.ss
    }
    if(strstr(state,"$GNGSA"))
    {
 
    }
    if(strstr(state,"$GPGSV"))
    {
 
    }
    if(strstr(state,"$GNGLL"))
    {
        step = NMEA_Comma_Pos((u8*)state, 5);
        time = NMEA_Str2num((u8*)state + step) / 100; //hhmmss.ss
    }
    //$GNZDA,hhmmss.00,dd,mm,yy, 本地区域小时, 本地区域分钟*hh(CR)(LF)
    if(strstr(state,"$GNZDA"))
     {
        step = NMEA_Comma_Pos((u8*)state, 1);
        time = NMEA_Str2num((u8*)state + step) / 100;
        //年月日转换颠倒了
      /*  step = NMEA_Comma_Pos((u8*)state, 2);
  date = date + NMEA_Str2num((u8*)state + step)*10000; 
     step = NMEA_Comma_Pos((u8*)state, 3);
  date = date + NMEA_Str2num((u8*)state + step)*100;
     step = NMEA_Comma_Pos((u8*)state, 4);
  date = date + NMEA_Str2num((u8*)state + step);*/
  //改正 
  step = NMEA_Comma_Pos((u8*)state, 2);
  date = date + NMEA_Str2num((u8*)state + step);
     step = NMEA_Comma_Pos((u8*)state, 3);
  date = date + NMEA_Str2num((u8*)state + step)*100;
     step = NMEA_Comma_Pos((u8*)state, 4);
  date = date + NMEA_Str2num((u8*)state + step)*10000; 
    }
     if ((time != 0) && (date != 0))/*存在有效时间信息*/
    {
        avail = 1;
        if((time != htime)||(date != hdate))/*存在时间信息更新*/
        {
            packg = 1;/*新包开始,旧包结束*/
            htime = time;
            hdate = date;
        }
        else/*时间信息没有更新*/
        {
            packg = 0;/*同数据包*/
        }
    }
    else //不存在有效时间信息 
    {
        avail = 0;/*无效数据*/
    }
 
    if(!avail)
    {
        signal = 0;
    }
    else //存在有效时间信息  
    {
        if(!packg)/*0同数据包*/
        {
            signal = 1;
        }
        else/*1新数据包*/
        {
            signal = 2;
        }
    }
    return signal;
}

标签:Str2num,u8,报文,state,step,NMEA,date,数据包
来源: https://blog.csdn.net/W_12306_M/article/details/106695884

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有