GPS-GPZDA数据解析C语言
gpgga 格工解析

gpgga 格工解析GPGGA格式解析GPGGA是全球定位系统(GPS)中的一种卫星定位报文格式。
本文将对GPGGA格式进行详细解析,包括其组成部分和各字段的含义。
一、GPGGA格式简介GPGGA格式是GPS定位信息的一种标准格式,用于描述接收器定位信息。
它由一系列以逗号分隔的字段组成,每个字段都有特定的含义和数据类型。
以下是GPGGA格式的示例:GPGGA,053930.00,2230.942,N,11354.905,E,1,08,1.0,17.3,M,-22.4,M,,*42接下来,我们将对其中的各字段进行详细解析。
二、GPGGA字段解析1. Sentence ID(报文ID): "GPGGA"是GPGGA格式的唯一标识符,用于区分其他GPS报文。
2. UTC Time(协调世界时): 以hhmmss.ss格式表示,表示接收到GPS信号时的时间。
在上述示例中,时间为05:39:30.00。
3. Latitude(纬度): 以ddmm.mmm格式表示,表示接收器所在位置的纬度。
上述示例中纬度为22度30.942分北纬。
4. Latitude Indicator(纬度指示): "N"表示北纬,"S"表示南纬。
5. Longitude(经度): 以dddmm.mmm格式表示,表示接收器所在位置的经度。
上述示例中经度为113度54.905分东经。
6. Longitude Indicator(经度指示): "E"表示东经,"W"表示西经。
7. Fix Quality(定位质量指示): 表示接收器定位的质量。
常见值有:1 - 定位解可用,但定位精度较差;2 - 差分GPS解可用,定位精度较好;0 - 定位解不可用。
上述示例中定位质量为1。
8. Satellites Tracked(跟踪卫星数): 表示接收器当前正在追踪的卫星数。
GPS信息原型及解析(常用NMEA-0183语句字段定义解释)

NMEA协议是为了在不同的GPS(全球定位系统)导航设备中建立统一的BTCM(海事无线电技术委员会)标准,由美国国家海洋电子协会(NMEA-The National Marine Electronics Associa-tion)制定的一套通讯协议。
GPS接收机根据NMEA-0183协议的标准规范,将位置、速度等信息通过串口传送到PC机、PDA 等设备。
NMEA-0183协议是GPS接收机应当遵守的标准协议,也是目前GPS接收机上使用最广泛的协议,大多数常见的GPS接收机、GPS数据处理软件、导航软件都遵守或者至少兼容这个协议。
不过,也有少数厂商的设备使用自行约定的协议比如GARMIN的GPS设备(部分GARMIN设备也可以输出兼容NMEA-0183协议的数据)。
软件方面,我们熟知的Google Earth目前也不支持NMEA-0183协议,但Google Earth已经声明会尽快实现对NMEA-0183协议的兼容。
呵呵,除非你确实强壮到可以和工业标准分庭抗礼,否则你就得服从工业标准。
NMEA-0183协议定义的语句非常多,但是常用的或者说兼容性最广的语句只有$GPGGA、$GPGSA、$GPGSV、$GPRMC、$GPVTG、$GPGLL等。
下面给出这些常用NMEA-0183语句的字段定义解释。
$GPGGA例:$GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,19.7,M,,,,0000*1 F字段0:$GPGGA,语句ID,表明该语句为Global Positioning System Fix Data (GGA)GPS定位信息字段1:UTC 时间,hhmmss.sss,时分秒格式字段2:纬度ddmm.mmmm,度分格式(前导位数不足则补0)字段3:纬度N(北纬)或S(南纬)字段4:经度dddmm.mmmm,度分格式(前导位数不足则补0)字段5:经度E(东经)或W(西经)字段6:GPS状态,0=未定位,1=非差分定位,2=差分定位,3=无效PPS,6=正在估算字段7:正在使用的卫星数量(00 - 12)(前导位数不足则补0)字段8:HDOP水平精度因子(0.5 - 99.9)字段9:海拔高度(-9999.9 - 99999.9)字段10:地球椭球面相对大地水准面的高度字段11:差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空)字段12:差分站ID号0000 - 1023(前导位数不足则补0,如果不是差分定位将为空)字段13:校验值$GPGSA例:$GPGSA,A,3,01,20,19,13,,,,,,,,,40.4,24.4,32.2*0A字段0:$GPGSA,语句ID,表明该语句为GPS DOP and Active Satellites(GSA)当前卫星信息字段1:定位模式,A=自动手动2D/3D,M=手动2D/3D字段2:定位类型,1=未定位,2=2D定位,3=3D定位字段3:PRN码(伪随机噪声码),第1信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)字段4:PRN码(伪随机噪声码),第2信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)字段5:PRN码(伪随机噪声码),第3信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)字段6:PRN码(伪随机噪声码),第4信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)字段7:PRN码(伪随机噪声码),第5信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)字段8:PRN码(伪随机噪声码),第6信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)字段9:PRN码(伪随机噪声码),第7信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)字段10:PRN码(伪随机噪声码),第8信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)字段11:PRN码(伪随机噪声码),第9信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)字段12:PRN码(伪随机噪声码),第10信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)字段13:PRN码(伪随机噪声码),第11信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)字段14:PRN码(伪随机噪声码),第12信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)字段15:PDOP综合位置精度因子(0.5 - 99.9)字段16:HDOP水平精度因子(0.5 - 99.9)字段17:VDOP垂直精度因子(0.5 - 99.9)字段18:校验值$GPGSV例:$GPGSV,3,1,10,20,78,331,45,01,59,235,47,22,41,069,,13,32,252,45*70字段0:$GPGSV,语句ID,表明该语句为GPS Satellites in View(GSV)可见卫星信息字段1:本次GSV语句的总数目(1 - 3)字段2:本条GSV语句是本次GSV语句的第几条(1 - 3)字段3:当前可见卫星总数(00 - 12)(前导位数不足则补0)字段4:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)字段5:卫星仰角(00 - 90)度(前导位数不足则补0)字段6:卫星方位角(00 - 359)度(前导位数不足则补0)字段7:信噪比(00-99)dbHz字段8:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)字段9:卫星仰角(00 - 90)度(前导位数不足则补0)字段10:卫星方位角(00 - 359)度(前导位数不足则补0)字段11:信噪比(00-99)dbHz字段12:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)字段13:卫星仰角(00 - 90)度(前导位数不足则补0)字段14:卫星方位角(00 - 359)度(前导位数不足则补0)字段15:信噪比(00-99)dbHz字段16:校验值$GPRMC例:$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A* 50字段0:$GPRMC,语句ID,表明该语句为Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐最小定位信息字段1:UTC时间,hhmmss.sss格式字段2:状态,A=定位,V=未定位字段3:纬度ddmm.mmmm,度分格式(前导位数不足则补0)字段4:纬度N(北纬)或S(南纬)字段5:经度dddmm.mmmm,度分格式(前导位数不足则补0)字段6:经度E(东经)或W(西经)字段7:速度,节,Knots字段8:方位角,度字段9:UTC日期,DDMMYY格式字段10:磁偏角,(000 - 180)度(前导位数不足则补0)字段11:磁偏角方向,E=东W=西字段16:校验值$GPVTG例:$GPVTG,89.68,T,,M,0.00,N,0.0,K*5F字段0:$GPVTG,语句ID,表明该语句为Track Made Good and Ground Speed (VTG)地面速度信息字段1:运动角度,000 - 359,(前导位数不足则补0)字段2:T=真北参照系字段3:运动角度,000 - 359,(前导位数不足则补0)字段4:M=磁北参照系字段5:水平运动速度(0.00)(前导位数不足则补0)字段6:N=节,Knots字段7:水平运动速度(0.00)(前导位数不足则补0)字段8:K=公里/时,km/h字段9:校验值$GPGLL例:$GPGLL,4250.5589,S,14718.5084,E,092204.999,A*2D字段0:$GPGLL,语句ID,表明该语句为Geographic Position(GLL)地理定位信息字段1:纬度ddmm.mmmm,度分格式(前导位数不足则补0)字段2:纬度N(北纬)或S(南纬)字段3:经度dddmm.mmmm,度分格式(前导位数不足则补0)字段4:经度E(东经)或W(西经)字段5:UTC时间,hhmmss.sss格式字段6:状态,A=定位,V=未定位字段7:校验值1、GPS DOP and Active Satellites(GSA)当前卫星信息$GPGSA,<1>,<2>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<4>,<5>, <6>*hh<CR><LF><1> 模式,M=手动,A=自动<2> 定位类型,1=没有定位,2=2D定位,3=3D定位<3> PRN码(伪随机噪声码),正在用于解算位置的卫星号(01~32,前面的0也将被传输)。
GPS数据包详细解析

$GPGGA,121252.000,3937.3032,N,11611.6046,E,1,05,2.0,45.9,M,-5.7,M,,0000*77 $GPRMC,121252.000,A,3958.3032,N,11629.6046,E,15.15,359.95,070306,,,A*54$GPVTG,359.95,T,,M,15.15,N,28.0,K,A*04$GPGGA,121253.000,3937.3090,N,11611.6057,E,1,06,1.2,44.6,M,-5.7,M,,0000*72$GPGSA,A,3,14,15,05,22,18,26,,,,,,,2.1,1.2,1.7*3D$GPGSV,3,1,10,18,84,067,23,09,67,067,27,22,49,312,28,15,47,231,30*70GPS上电后,每隔一定的时间就会返回一定格式的数据,数据格式为:$信息类型,x,x,x,x,x,x,x,x,x,x,x,x,x每行开头的字符都是‘$’,接着是信息类型,后面是数据,以逗号分隔开。
一行完整的数据如下:$GPRMC,080655.00,A,4546.40891,N,12639.65641,E,1.045,328.42,170809,,,A*60信息类型为:GPGSV:可见卫星信息GPGLL:地理定位信息GPRMC:推荐最小定位信息GPVTG:地面速度信息GPGGA:GPS定位信息GPGSA:当前卫星信息这里我们只解析GPRMC和GPGGA的信息GPRMC数据详解:$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh<1> UTC时间,hhmmss(时分秒)格式<2> 定位状态,A=有效定位,V=无效定位<3> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)<4> 纬度半球N(北半球)或S(南半球)<5> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)<6> 经度半球E(东经)或W(西经)<7> 地面速率(000.0~999.9节,前面的0也将被传输)<8> 地面航向(000.0~359.9度,以真北为参考基准,前面的0也将被传输)<9> UTC日期,ddmmyy(日月年)格式<10> 磁偏角(000.0~180.0度,前面的0也将被传输)<11> 磁偏角方向,E(东)或W(西)<12> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)解析内容:1.时间,这个是格林威治时间,是世界时间(UTC),我们需要把它转换成北京时间(BTC),BTC和UTC差了8个小时,要在这个时间基础上加8个小时。
GPS解析程序

GPS解析程序GPS.H#ifndef __GPS_H__#define __GPS_H__#include "common.h"typedef struct{u8 UTCDateTime[6]; //YMDHMSu8 Status; //A/Vu8 Latitude[9]; //ddmm.mmmmu8 NS; //N/Su8 Longitude[10]; //dddmm.mmmmu8 EW; //E/Wu8 Speed[5]; //速率000.0~999.9节u8 Course[5]; //航向000.0~359.9度}stru_GPSRMC;typedef struct{// u8 UTCTime[10]; //hhmmss.mmm // u8 Latitude[9]; //ddmm.mmmm// u8 NS; //N/S// u8 Longitude[10]; //dddmm.mmmm // u8 EW; //E/Wu8 PositionFix; //0,1,2,6u8 SatUsed[2]; //00~12// u8 HDOP[4]; //0.5~99.9u8 Altitude[7]; //-9999.9~99999.9}stru_GPSGGA;typedef struct{u8 Mode; //A/Mu8 Mode2; //0,1,2,3u8 SatUsedList[12];u8 PDOP[4];u8 HDOP[4];u8 VDOP[4];}stru_GPSGSA;typedef struct{u8 SatID;// u8 Elevation[2];//0-90 degree// u8 Azimuth[3]; //0-359 degreeu8 SNR; //0-99 dbHz}stru_SatInfo;typedef struct{u8 SatInView;stru_SatInfo SatInfo[12];}stru_GPSGSV;#define NMEA_NULL 0x00 //GPS语句类型#define NMEA_GPGGA 0x01#define NMEA_GPGSA 0x02#define NMEA_GPGSV 0x04#define NMEA_GPRMC 0x08void GPS(void);void ShowLongitude(u8,u8);void ShowLatitude(u8,u8);void ShowGPSTime(u8,u8);void GPSSateDataInit(void);bit ReciveOK(void);void ShowSatSNR(u8,u8);#endifGPS.C//-------------------------------------------------------//GPS 解析模块By wowbanui//版本历史:// 2010/08 v0.1 初始版本// 2011/03 v0.2 注释掉不需要的字段,部分数据直接处理成数值, // 减少内存占用.输出部分直接调用LCD命令,移植需更改//---------------------------------------------------------#include "GPS.H"#include "S1D15E06.h"static u8 NMEA_CMD=NMEA_NULL; //NMEA 语句static u8 NMEA_CMD_Buff[]="$GPxxx,"; //NMEA 语句类型缓存static u8 NMEA_CMD_Index=0; //读取CMD字符的个数static bit NMEA_CMD_Parsered=0; //CMD类型解析完毕static u8 NMEA_DAT_Block=0; //NMEA 数据字段号从0开始static u8 NMEA_DAT_BlockIndex=0; //NMEA 数据每个字段内字符索引从0开始static bit NMEA_CMD_Start=0; //NMEA 语句开始. 检测到$ 时置1static bit ReciveFlag=0; //数据接收完成. 最后一条GPRMC 语句发送完毕置1,static u8 ucTempA=0; //存储解析两位数字用的的十位临时变量static u8 SateInfoIndex=0; ////static u8 ucTemp[5];stru_GPSRMC xdata GPS_RMC_Data;stru_GPSGGA xdata GPS_GGA_Data;stru_GPSGSA xdata GPS_GSA_Data;stru_GPSGSV xdata GPS_GSV_Data;void GPSSateDataInit(void){u8 i;for(i=0;i<12;i++){GPS_GSV_Data.SatInfo[i].SatID=0x00;GPS_GSA_Data.HDOP[0]=0x01;GPS_GSA_Data.HDOP[1]=0x01;GPS_GSA_Data.HDOP[2]=0x01;GPS_GSA_Data.HDOP[3]=0x01;}}void ShowGPSTime(u8 ucLX,u8 ucLY){GPS_RMC_Data.UTCDateTime[3]+=8;if (GPS_RMC_Data.UTCDateTime[3]>23) {GPS_RMC_Data.UTCDateTime[3]-=24; //Hour GPS_RMC_Data.UTCDateTime[2]++; //Dayif (((GPS_RMC_Data.UTCDateTime[1]==1)||\ (GPS_RMC_Data.UTCDateTime[1]==3)||\ (GPS_RMC_Data.UTCDateTime[1]==5)||\ (GPS_RMC_Data.UTCDateTime[1]==7)||\ (GPS_RMC_Data.UTCDateTime[1]==8)||\ (GPS_RMC_Data.UTCDateTime[1]==10)||\ (GPS_RMC_Data.UTCDateTime[1]==12))&&\ (GPS_RMC_Data.UTCDateTime[2]>31)){GPS_RMC_Data.UTCDateTime[2]=1;//DayGPS_RMC_Data.UTCDateTime[1]++;//Month}if (((GPS_RMC_Data.UTCDateTime[1]==4)||\(GPS_RMC_Data.UTCDateTime[1]==6)||\(GPS_RMC_Data.UTCDateTime[1]==9)||\(GPS_RMC_Data.UTCDateTime[1]==11))&&\(GPS_RMC_Data.UTCDateTime[2]>30)){GPS_RMC_Data.UTCDateTime[2]=1;GPS_RMC_Data.UTCDateTime[1]++;}if((GPS_RMC_Data.UTCDateTime[1]==2)&&(GPS_RMC_Data.UTC DateTime[2]>28)){GPS_RMC_Data.UTCDateTime[2]=1;GPS_RMC_Data.UTCDateTime[1]++;}if(GPS_RMC_Data.UTCDateTime[1]>12){GPS_RMC_Data.UTCDateTime[1]=1;GPS_RMC_Data.UTCDateTime[0]++;}}LCD_SetLocation(ucLX,ucLY);LCD_PutChar(GPS_RMC_Data.UTCDateTime[0]/10+'0');LCD_PutChar(GPS_RMC_Data.UTCDateTime[0]%10+'0');LCD_PutChar('/');LCD_PutChar(GPS_RMC_Data.UTCDateTime[1]/10+'0');LCD_PutChar(GPS_RMC_Data.UTCDateTime[1]%10+'0');LCD_PutChar('/');LCD_PutChar(GPS_RMC_Data.UTCDateTime[2]/10+'0');LCD_PutChar(GPS_RMC_Data.UTCDateTime[2]%10+'0');LCD_PutChar(' ');LCD_PutChar(GPS_RMC_Data.UTCDateTime[3]/10+'0');LCD_PutChar(GPS_RMC_Data.UTCDateTime[3]%10+'0');LCD_PutChar(':');LCD_PutChar(GPS_RMC_Data.UTCDateTime[4]/10+'0');LCD_PutChar(GPS_RMC_Data.UTCDateTime[4]%10+'0');LCD_PutChar(':');LCD_PutChar(GPS_RMC_Data.UTCDateTime[5]/10+'0');LCD_PutChar(GPS_RMC_Data.UTCDateTime[5]%10+'0');}void ShowLatitude(u8 ucX,u8 ucY) // N dd'mm'ss.ssss{unsigned long s;LCD_SetLocation(ucX,ucY);LCD_PutChar(GPS_RMC_Data.NS); //北纬南纬标志LCD_PutChar(' ');LCD_PutChar(GPS_RMC_/doc/d61302 2198.html,titude[0]); //度, 直接提取LCD_PutChar(GPS_RMC_/doc/d61302 2198.html,titude[1]);LCD_PutChar(0x02); //度(°)符号LCD_PutChar(GPS_RMC_/doc/d61302 2198.html,titude[2]); //分, 直接提取LCD_PutChar(GPS_RMC_/doc/d61302 2198.html,titude[3]);//直接提取后四位分并扩大10000倍为整数存于Long型, 避免小数运算s=(GPS_RMC_/doc/d613022198.html,titud e[5]-'0')*1000+\(GPS_RMC_/doc/d613022198.html,tit ude[6]-'0')*100+\(GPS_RMC_/doc/d613022198.html,tit ude[7]-'0')*10+\(GPS_RMC_/doc/d613022198.html,tit ude[8]-'0');s*=60; //转换成单位秒(")LCD_PutChar('\'');LCD_PutChar(s/100000+'0');s=s%100000;LCD_PutChar(s/10000+'0');s=s%10000;LCD_PutChar('.');LCD_PutChar(s/1000+'0');s=s%1000;LCD_PutChar(s/100+'0');s=s%100;LCD_PutChar(s/10+'0');s=s%10;LCD_PutChar(s+'0');LCD_PutChar('"');}void ShowLongitude(u8 ucX,u8 ucY){unsigned long s;LCD_SetLocation(ucX,ucY);LCD_PutChar(GPS_RMC_Data.EW);LCD_PutChar(GPS_RMC_Data.Longitude[0]);LCD_PutChar(GPS_RMC_Data.Longitude[1]); LCD_PutChar(GPS_RMC_Data.Longitude[2]); LCD_PutChar(0x02);LCD_PutChar(GPS_RMC_Data.Longitude[3]); LCD_PutChar(GPS_RMC_Data.Longitude[4]); s=(GPS_RMC_Data.Longitude[6]-'0')*1000+\ (GPS_RMC_Data.Longitude[7]-'0')*100+\ (GPS_RMC_Data.Longitude[8]-'0')*10+\ (GPS_RMC_Data.Longitude[9]-'0');s*=60;LCD_PutChar('\'');LCD_PutChar(s/100000+'0');s=s%100000;LCD_PutChar(s/10000+'0');LCD_PutChar('.');s=s%10000;LCD_PutChar(s/1000+'0');s=s%1000;LCD_PutChar(s/100+'0');s=s%100;LCD_PutChar(s/10+'0');s=s%10;LCD_PutChar(s+'0');LCD_PutChar('"');}void ShowSatSNR(u8 ucX,u8 ucY){u8 i,j,Mode;for (i=0;i<12;i++){Mode=1;for (j=0;j<12;j++){if(GPS_GSV_Data.SatInfo[i].SatID==GPS_GSA_Data.SatUsedList[j]) Mode=3;}LCD_SNRBar(i*8,6,GPS_GSV_Data.SatInfo[i].SNR/4,Mode);}}bit ReciveOK(void){if (ReciveFlag)ReciveFlag=0;return 1;}else{return 0;}}static void ParserGPGGA(void){switch(SBUF){case '*': //语句结束NMEA_CMD_Start=0;break;case ',': //该字段结束NMEA_DAT_Block++;NMEA_DAT_BlockIndex=0;break;default: //字段字符switch(NMEA_DAT_Block) //判断当前处于哪个字段{case 5: //<6> GPS状态0=未定位, 1=非差分定位, 2=差分定位, 6=正在估算GPS_GGA_Data.PositionFix=SBUF;break;case 6: //<7> 正在使用的卫星数量00~12GPS_GGA_Data.SatUsed[NMEA_DAT_BlockIndex]=SBUF;break;case 8: //<9> 海拔高度-9999.9~99999.9GPS_GGA_Data.Altitude[NMEA_DAT_BlockIndex]=SBUF;break;}NMEA_DAT_BlockIndex++; //字段字符索引++, 指向下一个字符}}static void ParserGPRMC(void){switch(SBUF)case '*':NMEA_CMD_Start=0;ReciveFlag=1; //接收完毕, 可以处理break;case ',':NMEA_DAT_Block++;NMEA_DAT_BlockIndex=0;break;default:switch(NMEA_DAT_Block){case 0: //<1> UTC时间hhmmss.mmmswitch(NMEA_DAT_BlockIndex){case 0:case 2:case 4:ucTempA=SBUF-'0';break;case 1:GPS_RMC_Data.UTCDateTime[3]=ucT empA*10+SBUF-'0';break;case 3:GPS_RMC_Data.UTCDateTime[4]=ucT empA*10+SBUF-'0';break;case 5:GPS_RMC_Data.UTCDateTime[5]=ucT empA*10+SBUF-'0';break;}break;case 1: //<2> 定位状态A=有效定位, V=无效定位GPS_RMC_Data.Status=SBUF;break;case 2: //<3> 纬度ddmm.mmmmGPS_RMC_/doc/d613022198.html,titu de[NMEA_DAT_BlockIndex]=SBUF;break;case 3: //<4> 纬度半球N/SGPS_RMC_Data.NS=SBUF;break;case 4: //<5> 经度dddmm.mmmmGPS_RMC_Data.Longitude[NMEA_DAT_BlockIndex]=SBUF; break;case 5: //<6> 经度半球E/WGPS_RMC_Data.EW=SBUF;break;case 6: //<7> 地面速率000.0~999.9 节GPS_RMC_Data.Speed[NMEA_DAT_BlockIndex]=SBUF; break;case 7: //<8> 地面航向000.0~359.9 度, 以真北为参考基准GPS_RMC_Data.Course[NMEA_DAT_BlockIndex]=SBUF; break;case 8: //<9> UTC日期ddmmyyswitch(NMEA_DAT_BlockIndex){case 0:case 2:case 4:ucTempA=SBUF-'0';break;case 1:GPS_RMC_Data.UTCDateTime[2]=ucT empA*10+SBUF-'0'; break;case 3:GPS_RMC_Data.UTCDateTime[1]=ucT empA*10+SBUF-'0'; break;case 5:GPS_RMC_Data.UTCDateTime[0]=ucT empA*10+SBUF-'0';break;}break;}NMEA_DAT_BlockIndex++;}}static void ParserGPGSA(void){switch(SBUF){case '*':NMEA_CMD_Start=0;break;case ',':NMEA_DAT_Block++;NMEA_DAT_BlockIndex=0;//清空已使用卫星号, 避免上次数据干扰if((NMEA_DAT_Block>=2)||(NMEA_DAT_Block<=13)) GPS_GSA_Data.SatUsedList[NMEA_DAT_Block-2]=0x00; break;default:switch(NMEA_DAT_Block){case 0: //<1>模式M=手动, A=自动GPS_GSA_Data.Mode=SBUF;break;case 1: //<2>定位型式1=未定位, 2=二维定位, 3=三维定位GPS_GSA_Data.Mode2=SBUF;break;case 2: //<3> PRN 01~32 使用中的卫星编号case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:switch(NMEA_DAT_BlockIndex){case 0:ucTempA=SBUF-'0';break;case 1:GPS_GSA_Data.SatUsedList[NMEA_DAT_Block-2]=ucTempA*10+SBUF-'0';break;}break;case 14: //<4> PDOP 位置精度因子0.5~99.9GPS_GSA_Data.PDOP[NMEA_DA T_BlockIndex]=SBUF;break;case 15: //<5> HDOP 水平精度因子0.5~99.9GPS_GSA_Data.HDOP[NMEA_DAT_BlockIndex]=SBUF;break;case 16: //<6> VDOP 垂直精度因子0.5~99.9GPS_GSA_Data.VDOP[NMEA_DAT_BlockIndex]=SBUF; break;}NMEA_DAT_BlockIndex++;}}static void ParserGPGSV(void){switch(SBUF){case '*':NMEA_CMD_Start=0;break;case ',':NMEA_DAT_Block++;NMEA_DAT_BlockIndex=0;break;default:switch(NMEA_DAT_Block){case 1: //<2> 本句GSV的编号if (SBUF=='1') SateInfoIndex=0;//解析到第一句GSV 语句则判断卫星信息从心开始break;case 2: //<3> 可见卫星的总数00~12switch(NMEA_DAT_BlockIndex){case 0:ucTempA=SBUF-'0';break;GPS_GSV_Data.SatInView=ucTempA*10+SBUF-'0';break;}break;case 3: //<4> 卫星编号01~32case 7:case 11:case 15:switch(NMEA_DAT_BlockIndex){case 0:ucTempA=SBUF-'0';break;case 1:GPS_GSV_Data.SatInfo[SateInfoIndex].SatID=ucT empA*10+S BUF-'0';GPS_GSV_Data.SatInfo[SateInfoIndex].SNR=0x00;//清空信噪比数据, 避免上次数据干扰//因为当卫星信噪比无时GPS输出的NMEA数据中信噪比字段没有,//而导致直接跳到下一字段, 此时上次若有数据则直接会残留下来SateInfoIndex++;//卫星信息索引+1, 以下都-1处理//同上, 避免放于"信噪比"字段为空时处理不到break;}break;case 6: //<7>讯号噪声比C/No 00~99case 10:case 18:switch(NMEA_DAT_BlockIndex){case 0:ucTempA=SBUF-'0';break;case 1:GPS_GSV_Data.SatInfo[SateInfoIndex-1].SNR=ucT empA*10+SBUF-'0';break;}break;}NMEA_DAT_BlockIndex++;}}void GPS(void){LED_G=0;if(NMEA_CMD_Start){ //解析到以$开始的NMEA 语句, 进入NMEA 解析流程: if(NMEA_CMD_Parsered){ //CMD语句类型解析完毕, 根据类型条用解析函数switch(NMEA_CMD){case NMEA_GPGGA:ParserGPGGA();break;case NMEA_GPGSA:ParserGPGSA();break;case NMEA_GPGSV:ParserGPGSV();break;case NMEA_GPRMC:ParserGPRMC();break;default: //无法识别的格式, 复位NMEA_CMD=NMEA_NULL;NMEA_CMD_Parsered=0;NMEA_CMD_Index=1;NMEA_CMD_Start=0;}}else{ //需要解析CMD语句类型switch(SBUF){case ',': //第一个字段结束if(NMEA_CMD_Buff[4]=='G'&&NMEA_CMD_Buff[5]=='A') NMEA_CMD=NMEA_GPGGA;if(NMEA_CMD_Buff[4]=='S'&&NMEA_CMD_Buff[5]=='A')NMEA_CMD=NMEA_GPGSA;if(NMEA_CMD_Buff[5]=='V') NMEA_CMD=NMEA_GPGSV;if(NMEA_CMD_Buff[5]=='C') NMEA_CMD=NMEA_GPRMC;//此处如果都不成立, 即语句不被识别, 则NMEA_CMD为NULL 或其他,//则转为根据类型解析时会跳转到无法识别的格式, 而后复位NMEA_CMD_Parsered=1;NMEA_CMD_Index=1;NMEA_DAT_Block=0;NMEA_DAT_BlockIndex=0;break;case '*':NMEA_CMD_Start=0;break;default: //处于第一个字段中, 继续接收NMEA_CMD_Buff[NMEA_CMD_Index]=SBUF;NMEA_CMD_Index++;if (NMEA_CMD_Index>6) NMEA_CMD_Start=0;// CMD 超过6个字符, (数组越界, 导致死机)// 则判断不是正常的CMD语句, 则略过此句.}}}else{ //未解析到$, 循环接收并判断直到$if (SBUF=='$'){ //接收到$, 下一个字符即为类型判断字符, 先进行相关变量初始化NMEA_CMD_Buff[0]=SBUF;NMEA_CMD_Start=1; //下次调用则进入NMEA 解析流程:NMEA_CMD_Index=1; //从头存放GPS类型字符到变量NMEA_CMD_Parsered=0;NMEA_CMD=NMEA_NULL;NMEA_DAT_Block=0;NMEA_DAT_BlockIndex=0;}}LED_G=1;//变量定义char code TIME_AREA= 8; //时区//GPS数据存储数组unsigned char JD[10]; //经度unsigned char JD_a; //经度方向unsigned char WD[9]; //纬度unsigned char WD_a; //纬度方向unsigned char date[6]; //日期unsigned char time[6]; //时间unsigned char speed[5]={'0','0','0','0','0'}; //速度unsigned char high[6]; //高度unsigned char angle[5]; //方位角unsigned char use_sat[2]; //使用的卫星数unsigned char total_sat[2]; //天空中总卫星数unsigned char lock; //定位状态//串口中断需要的变量unsigned char seg_count; //逗号计数器unsigned char dot_count; //小数点计数器unsigned char byte_count; //位数计数器unsigned char cmd_number; //命令类型unsigned char mode; //0:结束模式,1:命令模式,2:数据模式unsigned char buf_full; //1:整句接收完成,相应数据有效。
nmea 数据解析 c语言

NMEA 0183是一种用于数据通信协议,常用于GPS和其他导航设备。
在C语言中解析NMEA 数据通常涉及以下几个步骤:1. **读取数据**:从GPS设备或其他源读取NMEA数据流。
2. **解析数据**:将NMEA数据字符串分解成其各个组成部分,如句子类型、时间、位置、速度等。
3. **验证校验和**:NMEA协议中的每个句子都有一个校验和,用于验证数据的完整性。
4. **提取有用信息**:根据需要提取有用的数据,如经纬度、速度、航向等。
5. **转换数据格式**:将提取的数据转换为所需的格式,例如从字符串转换为浮点数。
6. **处理数据**:根据需要对数据进行处理,例如计算距离或方位。
以下是一个简单的C语言示例,用于解析NMEA GPGGA(全球定位系统固定数据)句子:```c#include <stdio.h>#include <stdlib.h>#include <string.h>// 假设GPGGA句子的最大长度#define GPGGA_MAX_LENGTH 128// GPGGA句子的结构体typedef struct {char sentenceType[3]; // 句子类型,例如"GPGGA"double time; // 时间(小时)double latitude; // 纬度(度)double longitude; // 经度(度)int satellites; // 卫星数量double hdop; // 水平精度(DOP)double vdop; // 垂直精度(DOP)double checksum; // 校验和} GPGGA;// 解析GPGGA句子的函数int parseGPGGA(char *buffer, GPGGA *gpgga) {int i, j;double field[10];char *token;// 去除字符串前后的空格char *cleanBuffer = buffer;while (*cleanBuffer == ' ') cleanBuffer++;while (*cleanBuffer != '\0' && *cleanBuffer == ' ') cleanBuffer++;// 解析句子类型strncpy(gpgga->sentenceType, cleanBuffer, 3);cleanBuffer += 3;// 解析时间token = strtok(cleanBuffer, ",");if (token != NULL) {sscanf(token, "%lf", &field[0]);gpgga->time = field[0];}cleanBuffer = token + 1;// 解析纬度token = strtok(cleanBuffer, ",");if (token != NULL) {sscanf(token, "%lf", &field[1]);gpgga->latitude = field[1]; }cleanBuffer = token + 1;// 解析经度token = strtok(cleanBuffer, ",");if (token != NULL) {sscanf(token, "%lf", &field[2]);gpgga->longitude = field[2]; }cleanBuffer = token + 1;// 解析卫星数量token = strtok(cleanBuffer, ",");if (token != NULL) {sscanf(token, "%d", &field[3]);gpgga->satellites = field[3]; }cleanBuffer = token + 1;// 解析HDOPtoken = strtok(cleanBuffer, ",");if (token != NULL) {sscanf(token, "%lf", &field[4]);gpgga->hdop = field[4];}cleanBuffer = token + 1;// 解析VDOPtoken = strtok(cleanBuffer, ",");if (token != NULL) {sscanf(token, "%lf", &field[5]);gpgga->vdop = field[5];}cleanBuffer = token + 1;// 解析校验和token = strtok(cleanBuffer, ",");if (token != NULL) {sscanf(token, "%lf", &field[6]);gpgga->checksum = field[6]; }// 返回校验和字段的索引for (i = 0; i < 6; i++) {if (field[i] == gpgga->checksum) {return i;}}return -1; // 校验和不匹配}int main() {// 假设有一个GPGGA句子char buffer[GPGGA_MAX_LENGTH] = "GPGGA,123519,4807.038,N,01131.000,E,8,0.8,0.9,00000+00";// 解析GPGGA句子GPGGA gpgga;int result = parseGPGGA。
基于C语言的GPS解析程序

if(x==4||x==7) {}
else dat[x]=ch[y++];
}
break;
case 5: //东西经
dat[0]=ch[0];
break;
case 6: //航速
for(x=0;x<6;x++)
while((RMC_Data[i]!=',')&&(RMC_Data[i]!='*')) //RMC_Data[i]==','或者=='*'时结束循环。
{i++;}
if(j+1!=i)
{
for(j=j+1,k=0;j<i;j++)
{
uchar x,y;
send_byte('d');
switch(ch1)
{
case 0: //时间
for(x=0,y=0;x<8;x++)
{
if(x==2||x==5){time[x]=0x3a;}
else time[x]=ch[y++];
break;
case '*':
i=strlen(RMC_Data); //处理完成,软件结束。
break;
default:break;
}
}
// send_byte('e');
}
void GPRMC_Handle(uchar *ch,uchar ch1) //GPRMC信息,与,之间的子信息处理,存储到相应的结构体中元素中
gpgga解析代码 java

gpgga解析代码 javaGPS是全球定位系统(Global Positioning System)的简称,它是一种利用卫星进行定位、导航和定时服务的技术。
在GPS中,GPGGA 是一种特定的数据格式,用于提供卫星定位信息。
本文将介绍如何使用Java编写GPGGA解析代码,以从GPS接收器的输出中提取有用的定位信息。
在编写代码之前,首先需要了解GPGGA数据格式的结构。
GPGGA字符串由多个字段组成,每个字段之间以逗号分隔。
以下是GPGGA数据格式的各个字段及其含义:1. GPGGA标识:表示此字符串为GPGGA数据。
2. UTC时间:卫星定位的时间戳,格式为HHMMSS.SSS。
3. 纬度:以度为单位的纬度值,格式为ddmm.mmmm。
4. 纬度半球:表示纬度的北半球(N)或南半球(S)。
5. 经度:以度为单位的经度值,格式为dddmm.mmmm。
6. 经度半球:表示经度的东半球(E)或西半球(W)。
7. 定位质量指示符:表示定位质量的指示符,取值范围为0-8,其中0表示定位失效,1表示使用导航定位解算,2表示使用差分定位解算。
8. 使用卫星数量:表示用于定位解算的卫星数量。
9. HDOP:水平精度因子(Horizontal Dilution of Precision),表示定位的精度。
10. 海拔:以米为单位的海拔高度。
11. 高度单位:表示海拔高度的单位,一般为米。
12. 大地水准面偏差:相对于WGS-84椭球模型的大地水准面偏差。
13. 大地水准面偏差单位:表示大地水准面偏差的单位。
现在我们可以开始编写GPGGA解析代码了。
首先,需要创建一个名为"GPGGA解析代码.java"的Java文件,然后按照以下步骤编写代码:1. 导入所需的Java库:```import java.util.Arrays;```2. 创建一个名为"GPGGA解析代码"的Java类,并添加一个名为"main"的主方法:```public class GPGGA解析代码 {public static void main(String[] args) {// 在此处添加代码}}```3. 在"main"方法中,定义一个示例GPGGA字符串:```String gpggaString ="$GPGGA,123519.00,4807.038,S,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*4 7";```4. 使用String的split方法将GPGGA字符串分割为多个字段,并存储到一个数组中:```String[] gpggaFields = gpggaString.split(",");```5. 按照GPGGA数据格式的顺序,通过数组的索引提取各个字段的值,并将它们存储到适当的变量中:```String utcTime = gpggaFields[1];String latitude = gpggaFields[2];String latitudeHemisphere = gpggaFields[3];String longitude = gpggaFields[4];String longitudeHemisphere = gpggaFields[5];String positionQualityIndicator = gpggaFields[6];String satelliteCount = gpggaFields[7];String hdop = gpggaFields[8];String altitude = gpggaFields[9];String altitudeUnit = gpggaFields[10];String geoidSeparation = gpggaFields[11];String geoidSeparationUnit = gpggaFields[12];```6. 打印提取的定位信息:```System.out.println("UTC时间:" + utcTime);System.out.println("纬度:" + latitude + " " + latitudeHemisphere); System.out.println("经度:" + longitude + " " + longitudeHemisphere); System.out.println("定位质量指示符:" + positionQualityIndicator); System.out.println("使用卫星数量:" + satelliteCount);System.out.println("HDOP:" + hdop);System.out.println("海拔:" + altitude + " " + altitudeUnit);System.out.println("大地水准面偏差:" + geoidSeparation + " " + geoidSeparationUnit);```7. 运行代码,输出解析结果。
C#编写gps定位信息的接收

SetupComm(m_hCom,READBUFLEN/*读缓冲*/,WRITEBUFLEN/*写缓冲*/); // 初始化通讯设备参数 // 清除缓冲信息
PurgeComm(m_hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXC LEAR|PURGE_RXCLEAR) ; // 对异步 I/O 进行设置
CommTimeOuts.ReadIntervalTimeout = MAXDWORD;file://接收两 连续字节 的最大时间间隔
CommTimeOuts.ReadTotalTimeoutMultiplier=0;file:// 接收每 字节的 平均允许 时间
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
这是一种使用没有在标准下预定义的特殊内容的方法。它通常的格式为:$PmmmA,df1,df2,....,[CR][LF]P说明是属性内容,mmm定义为厂商信息代码,A(A-Z)表明信息类型。
NMEA-0183协议定义的语句非常的多,主要有$GPGLL、 $GPGGA、$GPVTG、$GPZDA等。因为本次课题我们需要使用GPS-GPZDA进行数据解析所以我们只介绍GPZDA标准格式的样式。
2.3.2
查询的标准格式为:$ttllQ,sss,[CR][LF]
前面两个字符表示请求者的信息源的识别码,后面两个字符是被查询设备的识别码,最后一个字符说明这是一个查询的信息。紧跟着的字符(SSS)包含了三个字的被查询内容的记忆信息。例如: $CCGPQ,ZDA[CR][LF] “CC”说明计算机正从“GP”这个设备查询ZDA中的内容。GPS将会每隔1秒发送内容直到有新的请求。
char chhour[5]={'\0'};
char chmin[5]={'\0'};
char chsec[8]={'\0'};
char chsum[10]={'\0'};
char afterch[128]={'\0'};
int i,j,n,m; /*定义并初始化一些数组,指针,整型变量等用于后续程序使用*/
通过这次课程设计我们可以了解,如何用GPZDA解析GPS的时间信号,在计算机上输出普通用户所能理解的语句,让用户能够在时间信息这方面更加精确地得到信息,给用户提供更可靠的更高水准的服务。
第一章
GPS全球卫星定位系统由21颗工作卫星和3颗备用卫星组成。它们分布在6个等间距的轨道平面上,每个轨道面上有4颗工作卫星。GPS能覆盖全球,能够连续、实时、隐蔽地定位,一次定位时间仅几秒到十几秒,用户不发射任何电磁信号,只要接受卫星导航信号即可定位,所以可全天候昼夜作业。
第二章
NMEA—0183通信方式是由美国国家海洋电子协会开发、维护并发布的标准,目前大多数GPS接收设备都遵循这一标准,该接口协议定义了在波特率4800的串口数据总线上传输的电器信号需求、数据传输协议和时间以及详细的句型格式,以“句子”为单位进行发送。假如数据域中的某个值无效,该值将被简单的忽略,但对应的“,”仍需发送。
发明准确的计时工具之后的短时间内,没有人会想象得到有了准确的时间会带来改变世界的冲击,影响了我们的生活,新兴的产品和服务产业都由其引发。GPS对精确的位置就有如时钟对精确的时间一样,因此其得到大范围使用。由于GPS定位需要非常精确的时间,每颗GPS卫星上都有精密的原子钟,所以发送的信号可以附带精确的时间信息。对于接收机也就有一定要求,GPS卫星接收机种类很多,根据型号分为测地型、全站型、定时型、手持型、集成型;根据用途分为车载式、船载式、机载式、星载式、弹载式。
图2NMEA-0183协议框架
图3编译过程流程图
2.1
编译过程主要分为四个阶段,分别是词法分析、语法分析、语义分析和代码生成。
第一个阶段是词法分析,它是从左到右一个字符一个字符的读取源程序并对字符进行扫描和分解,从而识别一个一个单词。
第二个阶段是语法分析,它是在词法分析的基础上将一个一个的单词组成各类语法短语,如“程序”、“语句”、“表达式”等。
摘要
GPS(Global Positioning System)可说是目前最热门、最受人瞩目的一项科技。简单的说,GPS是利用位于地球同步轨道上的同步卫星,以其相对位置的关系,来测出精确的位置,事实上,接收机往往可以锁住4颗以上的卫星,这时,接收机可按卫星的星座分布分成若干组,每组4颗,然后通过算法挑选出误差最小的一组用作定位,从而提高精度。GPS除了可作为精确的定位工具之外,同时也可以用作精密的测量工具。在进行大范围、大面积的地面测量时,往往受限于地球本身的弧度与测量仪器的精密程度,甚至于当时的天候状况或测量人员本身的许多因素,导致测量的结果产生或多或少的误差。倘若利用GPS来作为测量工具,由于人造卫星高悬于地表上空,受地表弯曲弧度的影响相对减少。透过GPS与GIS的结合,更可以让我们更快速、精确地处理所需的资料。
全球定位系统由三部分构成:(1)地面控制部分,由主控站(负责管理、协调整个地面控制系统的 工作)、地面天线(在主控站的控制下,向卫星注入寻电文)、监测站(数据自动收集中心)和通讯辅助系统(数据传输)组成;(2)空间部分,由24颗卫星组成,分布在6个道平面上;(3)用户装置部分, 主要由GPS接收机和卫星天线组成。
printf("This program is finished by our team:\nShenJianFeng WangTing HeXiaoTian\nSongZhenZhong WuYunChao CaiQiWei\n");
printf("Finished Time:2010-12-20\n\n");
<5> 校验和。
第三章
编程的主要思想:
由于GPZDA的形式是:$GPZDA,hhmmss,XX,XX,XXXX,,*hh,所以,我们学习老师的课件及上课的内容从而确定编程的主线:通过对逗号的扫描来确定每一段的解析数据,需要进一步解析的就再次解析,从而最终解析出所有我们需要的数据。具体的程序流程图如下,由主流程图和子流程图组成。
GPS的主要特点:(1)全天候;(2)全球覆盖;(3)三维定速定时高精度;(4)快速省时高效率;(5)应用广泛多功能。
NMEA-0183是美国国家海洋电子协会为海用电子设备制定的标准格式。目前业已成了GPS导航设备统一的RTCM标准协议。大多数常见的GPS接收机、GPS数据处理软件、导航软件都遵守或者至少兼容这个协议。GPS接收机根据NMEA-0183协议的标准规范,将位置、速度等信息通过串口传送到PC机、PDA等设备。
GPS的卫星系统对于地面观测者来说,每天将提前4分钟见到同一颗GPS卫星位于地平线以上的卫星颗数随着时间和地点的不同而不同,最少可见到4颗,最多可见到11颗。地面设备监控卫星上的各种设备是否工作正常,以及卫星是否一直沿着预定轨道运行。除此之外,使用者接收机能够捕获到按一定卫星高度截止角所选择的待测卫星的信号,并跟踪这些卫星的运行,对所接收到的GPS信号进行变换、放大和处理,以便测量出GPS信号从卫星到接收机天线的传播时间,解译出GPS卫星所发送的导航电文,实时地
全球定位系统的主要用途:(1)陆地应用,主要包括车辆导航、应急反应、大气物理观测、地球物理资源勘探、工程测量、变形监测、地壳运动监测、市政规划控制等;(2)海洋应用,包括远洋船最佳航程航线测定、船只实时调度与导航、海洋救援、海洋探宝、水文地质测量以及海洋平台定位、海平面升降监测等;(3)航空航天应用,包括飞机导航、航空遥感姿态控制、低轨卫星定轨、导弹制导、航空救援和载人航天器防护探测等。
无论是生活还是军事,GPS全球卫星定位系统都已经成为最重要的定位系统。它的信号所包含的信息中有位置信号和时间信号,NMEA-0183协议的其他语句格式解析可以为用户指明自己的所处方位,时间信息却不是很准确。用户所需要的除了准确的位置信息,还有收到信号时的准确时间。GPZDA是NMEA0183协议中专门为解析时间准备的编码,比NMEA0183协议中的其他语句格式更加精确,因此其专用性受到用户认可。经过20余年的实践证明,GPS系统已经发展成为多领域、多模式、多用途、多机型的国际性高新技术产业。
HERE:
printf("Welcome!Please input n (n=0 or 1 or2)\n 0 means Open the File 'a.txt'\n 1 means Open the File 'b.txt'\n 2 means Manual Operation Input):");
关键字:GPS 0183协议 GPZDA
图索引
前言
GPS全球卫星定位系统是目前世界上应用最广的定位系统,其准确性与可靠性都是首屈一指,由于GPS技术所具有的全天候、高精度和自动测量的特点,作为先进的测量手段和新的生产力,已经融入了国民经济建设、国防建设和社会发展的各个应用领域。GPS的信号不仅能传输三维位置和三维速度,还能传输时间信号,它的卫星系统是在地面监测站的监控下进行工作的,卫星上的精密电子钟经常与监测站校时,以保证时间信号的准确。因此,其时间信号也是GPS信号解析的一部分。
图1GPS卫星环绕图
计算出测站的三维位置,三维速度和时间。
GPS通过掌握卫星的位置,测定所在地点与卫星之间的距离,运用数学计算测得测站的三维位置,另外,接收机往往可以锁住4颗以上的卫星,收到四颗则加上高程值这时,接收机可按卫星的星座分布分成若干组,每组4颗,然后通过算法挑选出误差最小的一组用作定位,从而提高精度。要了解卫星所处的准确位置,需要优化设计卫星运行轨道,并且,地面监测站要连续不断监测卫星的运行状态,适时发送控制指令,使卫星保持在正确的运行轨道。每颗GPS卫星上都装置有十分精密的电子钟,并由监测站经常进行校准。卫星除了发送定位导航信息,也能发送时间信息,GPS接收机收到信息后就能对时间进行校准。所以,GPS接收机除了能准确定位之外,还可产生精确的时间信息。
2.3
NMEA0183中有以下三种基本的协议类型:
2.3.1
信息源的标准格式为:$ttsss,df1,df2,....[CR][LF]
在紧随$后的两个字符是用来识别作为信息内容识别码的后面三个字符,信息识别码定义了保留的数据区,在NMEA0183的标准下,每个类型的数据区的信息内容是符合标准的。例如:$HCHDM,238,M[CR][LF]。其中“HC”信息源是一个磁性的罗盘,“HDM”是表明后面的代表磁性的船首向航向,238是船首向航向的值,M则表示船首向航向值的磁性。
图4主流程图
图5解析子流程图
3.1
#include <stdio.h>