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

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

程序员文章站 2022-07-12 21:57:10
...

开发工具: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;
}