当前位置:文档之家› 单片机解析GPS数据

单片机解析GPS数据

三、单片机解读GPS信息的程序设计用单片机解读GPS信息是GPS模块使用最重要的环节,由于汲设到产品的保密问题,这里只介绍时间的处理方法,而方位、速度的处理方法不做介绍,但通过时间的处理方法,同样可以处理方位、速度。

1、获取GPS模块的输出信息由于GPS模块每秒输出一次:$GPGGA 、$GPGSA、$GPGSV、$GPRMC数据。

速率慢,因此必须采用中断方式接收!(采用查询会造成数据丢失),而且单片机只需要处理$GPRMC 信息,即可得到时间、方位、速度。

程序采用C51编制,在Keil C中编译!code unsigned char GPS_ASC[]="$GPRMC" ;//定义特征字符串unsigned char idata RsBuf[60];//**********************************************************//读取GPS模块串口数据, 采用中断方式void GetRs232_Data() interrupt 4{unsigned char i;unsigned int j;if (RI){RI=0;RsBuf[0]=SBUF;if (RsBuf[0] =='$'){//是GPS数据的开始,进入查询接收for (i=1;i<sizeof(GPS_ASC)-1;i++){j=GetUartDat();//接收下一个数据if (j<256) {RsBuf=(unsigned char)j;if (RsBuf!=GPS_ASC) return;}}//判别是否为$GPRMC数据,是继续接收!for (;i<sizeof(RsBuf);i++){j=GetUartDat();if (j<256) {RsBuf=(unsigned char)j;}else{break;}}// 接收完毕处理数据!if (1==JiaoYanDat(RsBuf)){FormatTimer(RsBuf);//格式化时间FormatSpeed(RsBuf);//处理速度}}}}// 2、接收数据的处理//数据处理前,必须要再次检验是否为$GPRMC信息。

unsigned char JiaoYanDat(unsigned char *p){unsigned char *pP;pP=strstr(p,GPS_ASC);if (pP == NULL) return 0;return 1;}// 3、接收的数据全部转换成二进制数据,便于纠错处理。

unsigned char ASC_To_Bin(unsigned char *p){unsigned char i;if (p[0]<'0' || p[0]>'9') return 0;if (p[1]<'0' || p[1]>'9') return 0;i=(p[0]-'0')*10;return (i+p[1]-'0');}// 4、时间调整//由于GPS模块采用格林威治时间,与北京时间相差8个时区,所以要加入8小时。

unsigned char TurnGLW(unsigned char GLW){return (GLW+8)%24;}// 5、格式化标准时间// 定义一个时间的数据结构:typedef struct{unsigned int ms;unsigned char Sec;unsigned char Min;unsigned char Hour;unsigned char Day;unsigned char Mon;unsigned char Week;unsigned char Year;}TIMER;//由于GPS模块输出的毫秒不准,所以时间数据结构中的ms变量数据不准!请不要随便使用!void FormatTimer(unsigned char *p){unsigned char i;Timer.ms=(p[14]-'0')*100+(p[15]-'0')*10+p[16]-'0';Timer.Hour=TurnGLW(ASC_To_Bin(&p[7]));Timer.Min=ASC_To_Bin(&p[9]);Timer.Sec=ASC_To_Bin(&p[11]);if (p[50]==','){Timer.Day=ASC_To_Bin(&p[51]);Timer.Mon=ASC_To_Bin(&p[53]);Timer.Year=ASC_To_Bin(&p[55]);}}// 6、单片机接收串口的数据//由于单片机接收GPS后续数据,采用了查询方式!所以要注意避免死机!必须要带超时处理!unsigned int GetUartDat(void){unsigned int i=0,j=0;RI=0;while(!RI){if (i++>30000){//超时时间j=256;return j; //退出标志}}j=SBUF;RI=0;return j;}// 7、单片机的串口设置// 采用89C52接收GPS数据的串口设置#define OSC0//定义使用晶振0=11.0592 1=18.4320#if OSCcode char BPSAsc[]={0x60,0xb0,0xd8,0xec,0xf6,0xfb,0xfb,};//18.4320MHz#elsecode char BPSAsc[]={0xa0,0xd0,0xe8,0xf4,0xfa,0xfd,0xfd,};//11.0592MHz#endif// 串口设置void InitBps (char Bps ){PCON &=0x7f;//PCON。

7==0SCON =0x50;//设置成串口1方式TH1=BPSAsc[Bps];//22.1184必须*2 2004-12-16TL1=TH1;TR1=1;}四、NEMA 0183协议祥解该协议为NAEA 0183 20版(此协议是为了在不同的GPS导航设备中建立统一的RTCM标准)。

下列命令描述了GPS 25导航仪的数据格式定义,包括波特率选择,秒脉冲输出,RTCM定义输出。

1、NMEA接收语句*GPS 25输入语句,主要为初始化,参数设置导通过RXP管脚(1)ALM(历书信息)格式:$GPALM、<1>、<2>、<3>、<4>、<5>、<6>、<7>、<8>、<9>、<10>、<11>、<12>、<13>、<14>、<15>、*hh<CR><LF>如果板上的备用电池耗完,用此语句初始化信息<1>在历书下传时能将历书总数传至GPS板上,当发送历书到GPS板上此字段可空或任意数。

<2>当前历书数20这个字段可为空或任意值;<3>卫星PRN数不清0到32<4>GPS星历数<5>SV状态,每个历书的17-24位<6>离心率<7>星历参考时间<8>倾角<9>上升速率<10>半轴<11>近地点的末端<12>节经度<13>近点离角<14>Afo 时间参数<15> Af1 时间参数hh:语句末端的hh为该语句的校检符,应由用户计算送给GPS 25板,计算规则为:“S”后的所有字节的8个计,每4个组成一个BCD码(A、B、C等应用大写)。

GPS 25输出,语句后均有校验位,用户可通过它,验证结果。

(2)初始化信息命令(仅在GPS 25上用)$PGRMI用来初始化板子设定卫星位置和时间该语句一般在裙位置和当前实际位置的距离超过800公里时使用,以回忆定位速度格式:$PGRMI$GPALM、<1>、<2>、<3>、<4>、<5>、<6>、*hh<CR><LF><1>纬度ddmm.mmm格式(初始化必须被写入板子)<2>纬度方向N或S<3>经度ddmm.mmm格式(初始化必须被写入板子)<4>经度方向E或N<5>当前UTC日期,kkmm yy格式<6>当前UTC时间hhmm ss格式(3)板子配置信息命令(仅用于GPS 25)$GPALM配置接收板上的参数,存储在备用电池上。

$GPALM、<1>、<2>、<3>、<4>、<5>、<6>、<7>、<8>、<9>、<10>、<11>、<12>、*hh<CR><LF><1>合适的工作模式A——自动,2——2D模式,3—3D模式<2>海平面高度-1500.00~1800.00米<3>地理坐标索引<4>用户在地坐标<5>用户大地坐标精度<6>用户大地坐标x轴<7>用户大地坐标y轴<8>用户大地坐标z轴<9>差分模式A—自动(激活时自动输出差分信息)D—差分模式<10>NMEA波特率1=200 2=2400 3=4800 4=9600<11>速度滤波器状态0=不过滤1—自动2~255=滤波器时间常数<12>PPS模式:1=无Z=1HZ波特率和PPS的改变在重新加电或PIN6初始化后发挥作用。

(4)输出语句的激活(仅适用于GPS 25)$PGRMO决定是否进行语句输出。

$PGRMO<1>、<2>*hh<CR><LF>(1)语句描述(2)语句模式0—关闭特殊1 —开启特2—关闭所有3—开启所有(除GPALM)注意:(1)如果为2或3时,不做检验。

允许有空字段(2)如果为0或1时,描述字段必须被定义(3)如果如果都不作用时(指上语句中<1><2>),该语句无影响(4)$PGRMO、GPALM、1将传送所有昨历2、NMEA的发送语句通过TXD管脚(GPS 25板上)(1)传输速率用户可自定义传输长度表传输长度=传输总字符数/每秒传输数波特率每秒传输数语句最大字符1200120GPGGA722400240GPGSA654800480GPGSV2109600960GPRMC70GPVTG34PGRME36PGRMT47PGRMV26PGRMF79LCGLL36LCDTG34缺省波特率为48000。

相关主题