c51 GPGGA数据流接收分析

来源:互联网 发布:约瑟夫环用到的算法 编辑:程序博客网 时间:2024/04/27 16:59
#include"reg52.h"char GPGGA[72]={0};int NumGGA=0;//GPG数组指针char GpsData[39]={0};//0-9时间,10-18纬度,19N/S,20-29经度,30E/W,31-(33-37)海拔,(34-38)'\0'int NumData=0;//Data数组指针int State=0;//状态字getGpsData()interrupt 4 using 1;int atoi(char*,int);void printLCD(char*);/*主函数初始化相关硬件死循环等待串口中断<span style="font-family: Arial, Helvetica, sans-serif;">*/</span>main(){initLCD();//初始化lcd12864显示屏SCON=0x51;//方式一,允许串行接受,开接收中断标志PCON=0x00;//SMOD=0IE=0x90;//EA=1,ES=1while(1);}/*串口接收中断*/getGpsData()interrupt 4 using 1{EA=0;//关闭中断允许位        RI = 0; // 重置串口中断标志位 switch(State){case 0:if(SUBF=='$')State=1;else State=0;break;case 1:if(SUBF=='G')State=2;else State=0;break;case 2:if(SUBF=='P')State=3;else State=0;break;case 3:if(SUBF=='G')State=4;else if(SUBF=='R')State=8;else State=0;break;case 4:if(SUBF=='G')State=5;else State=0;break;case 5:if(SUBF=='A')State=6;else State=0;break;case 6:if(SUBF=='*')State=7;else State=6;break;case 7:if(SUBF=='\r'){//数据校验int i;char CheckSum;for(i=1,CheckSum=0;GPGGA[i]!='*';i++)CheckSum^=GPGGA[i];//printf("%d %d\n",CheckSum,atoi(GPGGA+i+1,2));getchar();if(CheckSum==atoi(GPGGA+i+1,2))//参考http://www.xuebuyuan.com/1406698.htmlState=8;else State=0;}else State=7;}switch(State){case 8://遍历GPGGA,并将相关数据拷贝GpsData中for(int i=0,j=0,NumComma=0;;i++){if(GPGGA[i]==','){NumComma+=1;continue;}if(NumComma==10)//拷贝结束{GpsData[j]='\0';break;}if(!(NumComma==1||NumComma==2||NumComma==3||NumComma==4||NumComma==5||NumComma==9))continue;//跳过冗余信息GpsData[j]=GPGGA[i];j+=1;}向LCD发消息printLCD(GpsData);State=0;//最后重置State,NumGGANumGGA=0;break;case 0:NumGGA=0;break;default:GPGGA[NumGGA]=SUBF;NumGGA+=1;}EA=1;//打开中断允许位}//十六进制字符串转整形,正则式:(A|d)(A*d*)*int atoi(char *s,int length){int i,n;//if(length<=0)exit(0);//输入错误:跳出for(i=0,n=0;i<length;i++){if(s[i]>='0'&&s[i]<='9')n=s[i]-'0'+n*16;else if(s[i]>='A'&&s[i]<='F')n=s[i]-'A'+10+n*16;else if(s[i]>='a'&&s[i]<='f')n=s[i]-'a'+10+n*16;//else exit(0);//输入错误:跳出}return n;}

0 0