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

开发工具: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;
}
上一篇:h5端如何使用webrtc


下一篇:Android音视频开发之-WebRTC技术实践