原创 GPS串口数据解码程序

2009-9-20 20:52 5700 3 4 分类: 智能手机

bit ReceivingF = 0;
bit EndF = 0;
bit RMCF = 0;
bit GGAF = 0;
bit VTGF = 0;
bit GSAF = 0;

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

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

void GPRMC(uchar);
void GPGGA(uchar);
void GPVTG(uchar);
void GPGSA(uchar);
void gps(uchar);


/****************************************************/
//功能:NMEA-183协议解析
//入口:void
//返回:void
//全局变更修改:GPS_*,Segment,command,Bytes_counter,NewByteF
//修改记录:    2007.8.25 创建 by 54et           v1
//            2007.8.26  v1.1 修改解码结构
/****************************************************/
void gps(uchar tmp)
{
    //com_send_byte(tmp);
    if(tmp == '$')//起始标志
    {
         Command = 0;
        ReceivingF = 1;
        Bytes_counter = 0;
        Segment = 0;               //清空语句段计数器
        return;
    }
    if(ReceivingF)
    {        
        if(tmp == ',')
        {
            ++Segment;
            Bytes_counter = 0;    //清空段字节计数器
            return;
        }
        if(tmp == '*')//收到结束标志
        {
            ReceivingF = 0;
            EndF = 1;
            return;
        }
        if(Segment == 0)
        {
            if(Bytes_counter == 3) //段0,语句类型判断
            switch(tmp)
            {
                case 'G':Command = 1;//语句类型 $GPGGA
                        GGAF = 1;
                        break;
                case 'M':Command = 2;//语句类型 $GPRMC
                        RMCF = 1;
                        break;
                case 'T':Command = 3;//语句类型 $GPVTG
                        VTGF = 1;
                        break;
                case 'S':break;
                default:Command = 0; //非有效数据类型,终止当前数据接收
                        ReceivingF = 0;
                        break;
            }
            if(Bytes_counter == 4)
                if(Command==0 && tmp=='A')
                {
                    Command = 4;//语句类型 $GPGSA
                    GSAF = 1;
                }
         }
         else
         {
             switch(Command)
            {
                case 1:GPGGA(tmp);
                        break;
                case 2:GPRMC(tmp);
                        break;
                case 3:GPVTG(tmp);
                        break;
                case 4:GPGSA(tmp);
                        break;
                default:break;
            }
        }
         ++Bytes_counter;    
    }
    NewByteF = 0;
    
    return;
}


void GPGGA(uchar tmp)
{
    
     switch(Segment)
     {
            case 1:    if(Bytes_counter == 2 || Bytes_counter == 5)    //$GPGGA段1,UTC时间,hhmmss(时分秒)格式,取前6位 转换为HH:MM:SS格式
                    {
                        GPS_time[Bytes_counter] = ':';
                        ++Bytes_counter;
                    }
                    if(Bytes_counter<8)
                        GPS_time[Bytes_counter] = tmp;
                    GPS_time[8] = '\0';
                    break;    

            case 2:    if(Bytes_counter == 3)                  //$GPGGA 段2处理 纬度ddmm.mmmm(度分)格式
                    {
                        GPS_wd[Bytes_counter] = '.';    //接收第二个字节后插入'.'
                        ++Bytes_counter;
                        GPS_wd[11] = '\0';
                    }
                    if(Bytes_counter == 0)
                        ++Bytes_counter;
                    GPS_wd[Bytes_counter] = tmp;      
                    break;

            case 3:    GPS_wd[0] = tmp;                     //$GPGGA第3段处理 纬度半球N(北半球)或S(南半球)
                    break;

            case 4:    if(Bytes_counter == 4)                  //$GPGGA 段4处理 经度dddmm.mmmm(度分)格式
                    {
                        GPS_jd[Bytes_counter] = '.';    //接收第3个字节后插入'.'
                        ++Bytes_counter;
                        GPS_jd[12] = '\0';
                    }
                    if(Bytes_counter == 0)
                        ++Bytes_counter;
                    GPS_jd[Bytes_counter] = tmp;      
                    break;
        

            case 5:    GPS_jd[0] = tmp;                     //$GPGGA第5段处理 经度半球E(东经)或W(西经)
                    break;
                        
            case 6: GPS_quality = tmp;
                    break;
                                                                    
            case 7:    if(Bytes_counter<2)                    //$GPGGA第7段处理  正在使用解算位置的卫星数量(00~12)(前面的0也将被传输)
                        GPS_sv[Bytes_counter] = tmp;
                    GPS_sv[2] = '\0';     
                      break;
                                            
            case 9:    if(Bytes_counter<7)                     //$GPGGA第9段处理 海拔高度(-9999.9~99999.9)
                    {
                        GPS_alt[Bytes_counter] = tmp;
                        GPS_alt[Bytes_counter+1] = '\0';
                    }
                    break;

            default:break;
    }
}


void GPRMC(uchar tmp)
{
    switch(Segment)
    {
                                    
        case 9:    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;
        default:break;
         }
}


void GPGSA(uchar tmp)
{
    switch(Segment)
    {
        case 2:    GPS_status = tmp;                     //$GPGSA第2段处理 定位类型,1=没有定位,2=2D定位,3=3D定位
                break;
        default:break;
    }
}

void GPVTG(uchar tmp)
{
    switch(Segment)
    {
        case 7:if(Bytes_counter < 7)//地面速率(0000.0~1851.8公里/小时,前面的0也将被传输)
               {
                    GPS_speed[Bytes_counter] = tmp;
                    GPS_speed[Bytes_counter+1] = '$';//这里4个字符是Km/h
                    GPS_speed[Bytes_counter+2] = '"';
                    GPS_speed[Bytes_counter+3] = '/';
                    GPS_speed[Bytes_counter+4] = '#';
                    GPS_speed[Bytes_counter+5] = '\0';
                }
                break;
        default:break;
    }
}

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1588142 2011-6-7 10:31

顶起!!
相关推荐阅读
用户1482397 2009-11-06 15:02
曼彻斯特和差分曼彻斯特编码的实现
 //----------------------------------------------------------------------------     |//  标题: 曼彻斯特和差分...
用户1482397 2009-09-29 15:03
基于ZigBee协议的无线传感器网络设计
 引 言              传感器作为人们感官的延伸,在现代社会中得到了越来越广泛的应用。随着通信技术、嵌入式技术、传感器技术的发展,             传感器正逐渐向智能化、微型化、无...
用户1482397 2009-09-28 10:31
MSP430单片机的框架程序(转)
MSP430单片机的框架程序(转)下面给出MSP430的程序框架,我们可以在此基础上修改以及添加自己所需的程序。/*******************************************...
用户1482397 2009-09-23 11:00
利用USART实现单片机与串口通信[C语言]
利用USART实现单片机与串口通信[C语言]//实验目的:熟悉USART通信//通过“串口调试助手”协助工作//串口调试助手发送数据给877,877收到后再转发回串口助手//硬件要求:拨码开关S7全置...
用户1482397 2009-09-23 10:51
at89c2051制作的超声波测距源程序
#include <REG2051.H>#define k1 P3_4#define csbout    P3_5                  //超声波发送#define csbi...
用户1482397 2009-09-23 10:37
定时器程序
 #include <REGX52.H>     //AT89S52头文件#define uint unsigned int#define uchar unsigned charuchar...
EE直播间
更多
我要评论
1
3
关闭 站长推荐上一条 /3 下一条