搜索
bottom↓
回复: 4

为什么我用查询方式解析GPS模块语句每次都输不出来?

[复制链接]

出0入0汤圆

发表于 2013-3-27 10:38:18 | 显示全部楼层 |阅读模式

#include "STC12.h"          //STC12C5A60S2,1T单片机,11.0592Mhz
#include<intrins.h>

#define uchar unsigned char
#define uint  unsigned int

//sbit E=P2^7;          //1602使能端
//sbit RW=P2^6;              //1602读写选择
//sbit RS=P2^5;         //

bit ReceivingF = 0;   //开始接收标志
bit EndF = 0;                  //结束标志
bit RMCF = 0;         //$GPRMC
bit GGAF = 0;         //$GPGGA
bit GGA_END = 0;         //$GPVTG
bit RMC_END = 0;         //$GPGSA
bit NewByteF;

uchar GPS_time[9];         //UTC时间  
uchar GPS_wd[12];          //纬度
uchar 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;
uchar num = 0;            //读取次数

void GPRMC(uchar);
void GPGGA(uchar);
//void GPVTG(uchar);
//void GPGSA(uchar);
void GPS(uchar);

/*void delay_10ms(uint del)  //延时10ms*del
{
        uint i,j;
        for(i=0; i<del; i++)
        for(j=0; j<1827; j++)   
        ;
}*/

/*void delay()
{
        int i,j;
        for(i=0; i<=10; i++)
        for(j=0; j<=2; j++)
                ;
}*/
/*
void enable(uchar del)
{
        P0 = del;
        RS = 0;
        RW = 0;
        E = 0;
        delay();
        E = 1;
        delay();
}

void write(uchar del)
{
        P0 = del;
        RS = 1;
        RW = 0;
        E = 0;
        delay();
        E = 1;
        delay();
}

void L1602_init(void)
{
        enable(0x01);
        enable(0x38);
        enable(0x0c);
        enable(0x06);
        enable(0xd0);
}

void L1602_string(uchar hang,uchar lie,uchar *p)
{
        uchar a;
        if(hang == 1) a = 0x80;
        if(hang == 2) a = 0xc0;
        a = a + lie - 1;
        enable(a);
        while(1)
        {
                if(*p == '\0') break;
                write(*p);
                p++;
        }
}
*/
void Com1_init(void)
{                PCON &= 0x7f;                //波特率不倍速
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
        AUXR &= 0xfe;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0f;                //清除定时器1模式位
        TMOD |= 0x20;                //设定定时器1为8位自动重装方式
        TL1 = 0xDC;                //设定定时初值
        TH1 = 0xDC;                //设定定时器重装值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;                //启动定时器1
}
/*void Com2_Init(void)                //9600bps@11.0592MHz
{
        AUXR &= 0xf7;                //波特率不倍速
        S2CON = 0x50;                //8位数据,可变波特率
        BRT = 0xDC;                //设定独立波特率发生器重装值
        AUXR |= 0x04;                //独立波特率发生器时钟为Fosc,即1T
        AUXR |= 0x10;                //启动独立波特率发生器
}*/
void SendChar(unsigned char d)
{
       
        SBUF=d;
        while(!TI);        //等待发送完成,TI置位
        TI=0;
}
/*发送字符串子程序,可以直接发字符串(未必是数组)*/
void SendMsg(unsigned char msg[])
{        int i=0;
        while(msg[i] != '\0')
              {
                SBUF = msg[i];                //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
         while(!TI);                                // 等特数据传送        (TI发送中断标志)
                 TI = 0;                                        // 清除数据传送标志
                        i++;                                          

// 下一个字符

           }
    i=0;
}
char RecChar ()
        {
                while(!RI);       //RI接受中断标志
                              RI=0;             //清除RI接受中断标志
             //SUBF接受/发送缓冲器
               return SBUF;
        }
       
/*用串口2发送字符串子程序,可以直接发字符串(未必是数组)*/
/*void SendMsg(unsigned char msg[])
{        int i=0;
        while(msg[i] != '\0')
              {
                S2BUF = msg[i];                //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
         while(!(S2CON&0x02));                                // 等特数据传送        (TI发送中断标志)
                 S2CON &= ~0x02;                                        // 清除数据传送标志
               
                i++;                                            // 下一个字符

   }
    i=0;
}*/
/*void GPS_interrupt() interrupt 4
{
        if(RI == 1)
        {
                EA = 0;
               
                GPS(SBUF);
        }
        RI = 0;
        EA = 1;
}*/
void GPS(uchar 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;
            if(GGAF==1){GGA_END=1;GGAF=0;}
                                                if(RMCF==1){RMC_END=1;RMCF=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';
                                                                                //num++;
                    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;      
                                                                                //num++;
                    break;

            case 3:    GPS_wd[0] = tmp;                   //$GPGGA第3段处理 纬度半球N(北半球)或S(南半球)
                     //num++;
                                                                                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;      
                    //num++;
                                                                                break;
        

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

            default:break;
    }
}

void GPRMC(uchar tmp)
{
    switch(Segment)
    {        case 2:        GPS_status = tmp;
                                                                //num++;                      //$GPRMC第二段,A有效V无效
                break;
                       
                        case 7:if(Bytes_counter < 7)//地面速率(0000.0~1851.8公里/小时,前面的0也将被传输)
               {
                    GPS_speed[Bytes_counter] = tmp;
                    
                }
                                                                //num++;
                break;
                                    
        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';
                }
                                                                //num++;
                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;
    }
}*/

void show()
                {SendMsg("Date:\0");
                SendMsg(GPS_date);
                SendChar(' ');
                SendMsg("Time:\0");
                SendMsg(GPS_time);
                SendChar(' ');
                SendMsg("Latitude:\0");
                SendMsg(GPS_wd);
                SendChar(' ');
                SendMsg("Longitude:\0");
                SendMsg(GPS_jd);
                SendChar(' ');
                SendMsg("Altitude:\0");
                SendMsg(GPS_alt);
                SendChar('m');
                SendChar(' ');
                SendMsg("Speed:\0");
                SendMsg(GPS_speed);
                SendMsg("kts\0");               
                SendChar(' ');
                SendMsg("Status:\0");
                if(GPS_status=='A')
                {SendMsg("Location active\0");}
                else{SendMsg("Location void\0");}
                SendMsg("\r\n\0");
        }
       
void main()
{
        //L1602_init();
        //L1602_string(1,1,"GPS initializing");
        //L1602_string(2,1,"Please wait");
        //delay_10ms(100);
        /*while(num)
        {
                L1602_string(2,12,".");
                delay_10ms(100);
                L1602_string(2,13,".");
                delay_10ms(100);
                L1602_string(2,14,".");
                delay_10ms(100);
                L1602_string(2,12," ");
                L1602_string(2,13," ");
                L1602_string(2,14," ");
                delay_10ms(100);
                num--;
        }
        L1602_string(1,1,"                ");
        L1602_string(2,1,"                ");
        */
       
        Com1_init();
        while(1)
        { while(!((GGA_END==1)&&(RMC_END==1)))
                {GPS(RecChar());
               
}
                GGA_END=0;
                RMC_END=0;
                show();
        //SendMsg(GPS_date);
                //GPS(RecChar());
               
                 /*uchar GPS_time[9];         //UTC时间  
uchar GPS_wd[12];          //纬度
uchar 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日期

                L1602_string(1,1,GPS_wd);
                 L1602_string(2,1,GPS_jd);
                 L1602_string(2,14,"   ");
                 delay_10ms(400);
                 L1602_string(1,1,"                ");
             L1602_string(2,1,"                ");
                 L1602_string(1,1,"Date:");
                 L1602_string(2,1,"Time:");
                 L1602_string(1,6,GPS_date);
                 L1602_string(2,6,GPS_time);
                 delay_10ms(400);
                 L1602_string(1,1,"                ");
                 L1602_string(2,1,"                ");
                 L1602_string(1,1,"speed:");
                 L1602_string(2,1,"alt:");
                 L1602_string(1,7,GPS_speed);
                 L1602_string(2,5,GPS_alt);
                 L1602_string(2,10,"m");
                 delay_10ms(400);
                 L1602_string(1,1,"                ");
                 L1602_string(2,1,"                ");*/
        }
}


阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2013-3-27 10:39:56 | 显示全部楼层
本帖最后由 dessertfox 于 2013-3-27 10:42 编辑

程序是改自这个的。我把LCD显示的都注释掉了,加了两个标志位GGA_END和RMC_END,用以判断是否全部接收完成。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入442汤圆

发表于 2013-3-27 11:13:51 | 显示全部楼层
你的main有问题吧,我怎么没看到判断?你先检查你的GPS数据是GPGGA还是什么。

出0入0汤圆

 楼主| 发表于 2013-3-27 11:42:57 来自手机 | 显示全部楼层
wye11083 发表于 2013-3-27 11:13
你的main有问题吧,我怎么没看到判断?你先检查你的GPS数据是GPGGA还是什么。 ...

这肯定没问题……
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-18 11:54

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表