原创 GPS数据解析函数

2007-8-25 20:43 8302 6 7 分类: 通信

朋友写了个GPS模块的程序,转来给大家看看


bit ReceivingF = 0;
bit EndF = 0;
bit NewByteF="0";

uchar GPS_time[9];                  //UTC时间
uchar GPS_wd[11];                  //纬度
uchar GPS_jd[12];                  //经度
uchar GPS_warn;                          //定位警告
uchar GPS_status;                  //定位状态
uchar GPS_alt[8];                  //海拔
uchar GPS_sv[3];                  //使用卫星
uchar GPS_speed[6];                  //速度
uchar GPS_date[9];                  //UTC日期

uchar Segment;                           //逗号计数
uchar Bytes_counter;
uchar Command;
uchar tmp;

void uart(void) interrupt 4
{
    if(RI)
    {
            tmp = SBUF;
                NewByteF = 1;
                RI = 0;
                return;
        }
}

void gps(void)
{
        if(tmp == '$')//起始标志
        {
                ReceivingF = 1;
                Bytes_counter = 0;
                Segment = 0;   //清空语句段计数器
                return;
        }
        if(ReceivingF)
        {               
                if(tmp == ',')
                {
                        ++Segment;
                        Bytes_counter = 0;//清空段字节计数器
                }
                if(tmp == '*')//收到结束标志
                {
                        Command = 0;
                        ReceivingF = 0;
                        EndF = 1;
                        return;
                }
                switch(Segment)          //分段处理
                {
                        case 0:if(Bytes_counter == 3) //段0,语句类型判断
                                switch(tmp)
                                {
                                        case 'G':Command = 1;//语句类型 $GPGGA
                                                        break;
                                        case 'M':Command = 2;//语句类型 $GPRMC
                                                        break;
                                        default:Command = 0; //非有效数据类型,终止当前数据接收
                                                        ReceivingF = 0;
                                                        break;
                                }
                                break;
                        case 1:switch(Command)
                                        {
                                                case 1:        if(Bytes_counter == 2 || Bytes_counter ==5)        //$GPGGA段1,UTC时间,hhmmss(时分秒)格式,取前6位 转换为HH:MM:SS格式
                                                                       
                                                                        GPS_time[Bytes_counter] = tmp;
                                                                if(Bytes_counter>1 && Bytes_counter<4)
                                                                break;
                                                case 2:break;                                                 //$GPRMC第1段处理 忽略       
                                        }
                                        break;
                                       
                        case 2:switch(Command)
                                        {
                                                case 1:        if(Bytes_counter == 2)                                  //$GPGGA 段2处理 纬度ddmm.mmmm(度分)格式
                                                                {
                                                                        GPS_wd[Bytes_counter] = '.';        //接收第二个字节后插入'.'
                                                                        ++Bytes_counter;
                                                                        GPS_wd[10] = '\0';
                                                                }
                                                                if(Bytes_counter == 0)
                                                                        ++Bytes_counter;
                                                        GPS_wd[Bytes_counter] = tmp;          
                                                        break;
                                                case 2:        GPS_warn = tmp; //$GPRMC第二段处理 定位状态,A=有效定位,V=无效定位
                                                                break;
                                        }
                                        break;
                        case 3:switch(Command)
                                        {
                                                case 1:        GPS_wd[0] = tmp; //$GPGGA第3段处理 纬度半球N(北半球)或S(南半球)break;
                                                case 2:                                         //$GPRMC第3段处理 忽略
                                                                break;
                                        }
                                        break;
                        case 4:switch(Command)
                                        {
                                                case 1:        if(Bytes_counter == 3)                                  //$GPGGA 段4处理 经度dddmm.mmmm(度分)格式
                                                                {
                                                                        GPS_jd[Bytes_counter] = '.';        //接收第3个字节后插入'.'
                                                                        ++Bytes_counter;
                                                                        GPS_jd[11] = '\0';
                                                                }
                                                                if(Bytes_counter == 0)
                                                                        ++Bytes_counter;
                                                                GPS_jd[Bytes_counter] = tmp;          
                                                                break;
                                                case 2:                                                                         //$GPRMC第4段 忽略
                                                                break;
                                        }
                                        break;
                        case 5:        switch(Command)
                                        {
                                                case 1:        GPS_jd[0] = tmp;         //$GPGGA第5段处理 经度半球E(东经)或W(西经)
                                                                break;
                                                case 2:                                                 //$GPRMC第5段处理 忽略
                                                                break;
                                        }
                                        break;
                        case 6:        switch(Command)
                                        {
                                                case 1:        GPS_status = tmp;         //$GPGGA第6段处理 GPS状态:0=未定位,1=非差分定位,2=差分定位,6=正在估算
                                                                break;
                                                case 2:                                                 //$GPRMC第6段处理 忽略
                                                                break;
                                        }
                                        break;                                                                                       
                        case 7:        switch(Command)
                                        {                                                         
                                                case 1:        if(Bytes_counter<2)        //$GPGGA第7段处理  正在使用解算位置的卫星数量(00~12)(前面的0也将被传输)
                                                                        GPS_sv[Bytes_counter] = tmp;
                                                                GPS_sv[2] = '\0';        
                                                                break;
                                                case 2:        if(Bytes_counter<5)        //$GPRMC第7段处理 地面速率(000.0~999.9节,前面的0也将被传输)
                                                                {
                                                                        GPS_speed[Bytes_counter] = tmp;
                                                                        GPS_speed[Bytes_counter+1] = '\0';
                                                                }
                                                                break;
                                        }
                                        break;                                               
                        case 9:        switch(Command)
                                        {
                                                case 1:        if(Bytes_counter<7)         //$GPGGA第9段处理 海拔高度(-9999.9~99999.9)
                                                                {
                                                                        GPS_alt[Bytes_counter] = tmp;
                                                                        GPS_alt[Bytes_counter+1] = '\0';
                                                                }
                                                                break;
                                                case 2:        if(Bytes_counter<2)        //$GPRMC第9段处理 UTC日期,ddmmyy(日月年)格式转换为yy.mm.dd
                                                                {
                                                                        GPS_date[6+Bytes_counter] = tmp;
                                                                }
                                                                if(Bytes_counter>1 && Bytes_counter<4)//月
                                                                {
                                                                        GPS_date[1+Bytes_counter] = tmp;
                                                                        GPS_date[5] = '-';
                                                                }
                                                                if(Bytes_counter>3 && Bytes_counter<6)//年
                                                                {
                                                                        GPS_date[Bytes_counter-4] = tmp;
                                                                        GPS_date[2] = '-';
                                                                        GPS_date[8] = '\0';
                                                                }
                                                                break;
                                        }
                                        break;
                        default:break;
                 }
                ++Bytes_counter;         
        }
        NewByteF = 0;
}

文章评论1条评论)

登录后参与讨论

用户946826 2011-6-28 21:50

好东西
相关推荐阅读
用户71098 2014-11-18 09:41
智能家居不应被手机化绑架
现在很多产品都围绕着手机开发,手机集成的功能也越来越多,甚至可以实现移动办公。以智能家居来说,几乎所有的产品都围绕着手机终端开发,小到一只灯泡、大到电视、冰箱、洗衣机…只要摆在家里的电器,都可以通...
用户71098 2014-11-18 09:40
智能家居不应被手机化绑架
现在很多产品都围绕着手机开发,手机集成的功能也越来越多,甚至可以实现移动办公。以智能家居来说,几乎所有的产品都围绕着手机终端开发,小到一只灯泡、大到电视、冰箱、洗衣机…只要摆在家里的电器,都可以通...
用户71098 2014-11-01 10:03
浅谈智能家居
最早期,小商家们打着智能家居的幌子,推出了遥控开关、定时开关,以低廉的价格去打入市场。这时,所谓的智能家居,就是狭义上的传统开关智能化,与真正意义的智能家居相差甚远。但凭着商家搞得噱头,当时这类开...
用户71098 2013-09-09 16:09
GSM继电器的PCB回来了
前几天发出打样的PCB回来了,先上几个图               ...
用户71098 2013-09-09 16:08
GSM继电器板基本焊接好了
PCB到手几天了,今天上午把元件基本焊接好,除了一些端子没有,回头把没有的原件买回来喊上就可以了,指示灯位置也跟外壳吻合,太好了,简单测试了下,GSM模块跟电脑连接测试,打电话和发信息都没问题了,...
用户71098 2013-08-29 15:13
想用SIM900A做个小东西
        早几年前,折腾过TC35I,后来因为别的事情就搁置了,现在想再搞起来,但TC35I的连接座手焊有一定难度,所以就不用它了,网上搜索一番,发现SIM900A还挺好,邮票口的封装,手焊...
我要评论
1
6
关闭 站长推荐上一条 /2 下一条