• GPS的NMEA数据解析

             NMEA是一套定义接收机输出的标准信息,有几种不同的格式,每种都是独立相关的ASCII格式,逗点隔开数据流,数据流长度从30-100字符不等,通常以每秒间隔选择输出,最常用的格式为"GGA",它包含了定位时间,纬度,经度,高度,定位所用的卫星数,其他的有速度,跟踪,日期等。

            NMEA-0183协议定义的语句非常多,但是常用的或者说兼容性最广的语句只有$GPGGA、$GPGSA、$GPGSV、$GPRMC、$GPVTG、$GPGLL等,说明如下:

    $GPGGA(定位信息)
    eg:$GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,19.7,M,,,,0000*1F
    $GPGSA(当前卫星信息)
    eg:$GPGSA,A,3,01,20,19,13,,,,,,,,,40.4,24.4,32.2*0A
    $GPGSV(可见卫星信息)
    eg:$GPGSV,3,1,10,20,78,331,45,01,59,235,47,22,41,069,,13,32,252,45*70
    $GPVTG(地面速度信息)
    eg:$GPVTG,89.68,T,,M,0.00,N,0.0,K*5F
    $GPGLL(地理定位信息)
    $GPGLL,4250.5589,S,14718.5084,E,092204.999,A*2D

            以下以代码段来说明$GPGGA的解析过程,其他类推。假设已从串口读到字符串。

    (1)结构体信息

    typedef struct{
    	int year;  
    	int month; 
    	int day;
    	int hour;
    	int minute;
    	int second;
    }date_time;
    
    typedef struct{
    	 date_time D;//时间
    	 char status;  		//接收状态
    	 double	latitude;   //纬度
    	 double longitude;  //经度
    	 char NS;           //南北极
    	 char EW;           //东西
    	 double speed;      //速度
    	 double high;       //高度
    }GPS_INFO;

    (2)得到指定序号的逗号位置,以解析各个定义段

    static int GetComma(int num,char *str)
    {
    	int i,j=0;
    	int len=strlen(str);
    	for(i=0;i<len;i++)
    	{
    		if(str[i]==',')j++;
    		if(j==num)return i+1;	//返回当前找到的逗号位置的下一个位置
    	}
    	return 0;	
    }

            得到精度纬度等高精度数据

    static double get_double_number(char *s)
    {
    	char buf[128];
    	int i;
    	double rev;
    	i=GetComma(1,s);    //得到数据长度
    	strncpy(buf,s,i);
    	buf[i]=0;			//加字符串结束标志
    	rev=atof(buf);		//字符串转float
    	return rev;
    }

            将世界时转换为北京时间

    static void UTC2BTC(date_time *GPS)
    {
    //***************************************************
    //如果秒号先出,再出时间数据,则将时间数据+1秒
    		GPS->second++; //加一秒
    		if(GPS->second>59){
    			GPS->second=0;
    			GPS->minute++;
    			if(GPS->minute>59){
    				GPS->minute=0;
    				GPS->hour++;
    			}
    		}	
    
    //***************************************************
    		GPS->hour+=8;		//北京时间跟UTC时间相隔8小时
    		if(GPS->hour>23)
    		{
    			GPS->hour-=24;
    			GPS->day+=1;
    			if(GPS->month==2 ||GPS->month==4 ||GPS->month==6 ||GPS->month==9 ||GPS->month==11 ){
    				if(GPS->day>30){			//上述几个月份是30天每月,2月份还不足30
    			   		GPS->day=1;
    					GPS->month++;
    				}
    			}
    			else{
    				if(GPS->day>31){			//剩下的几个月份都是31天每月
    			   		GPS->day=1;
    					GPS->month++;
    				}
    			}
    			if(GPS->year % 4 == 0 ){//
    		   		if(GPS->day > 29 && GPS->month ==2){		//闰年的二月是29天
    		   			GPS->day=1;
    					GPS->month++;
    				}
    			}
    			else{
    		   		if(GPS->day>28 &&GPS->month ==2){		//其他的二月是28天每月
    		   			GPS->day=1;
    					GPS->month++;
    				}
    			}
    			if(GPS->month>12){
    				GPS->month-=12;
    				GPS->year++;
    			}		
    		}
    }

    (3)解析GPS数据,以line作为传入的字符串数据,GPS是待赋值的全局变量。以下第一行是字符顺序号

    //0      7  0   4 6   0     6 8 0        90         0  3      0        9  
    //$GPRMC,091400,A,3958.9870,N,11620.3278,E,000.0,000.0,120302,005.6,W*62
    //$GPGGA,091400,3958.9870,N,11620.3278,E,1,03,1.9,114.2,M,-8.3,M,,*5E

    void gps_parse(char *line,GPS_INFO *GPS)
    {
    	int i,tmp,start,end;
    	char c;
    	char* buf=line;
    	c=buf[5];
    
    	if(c=='C'){//"GPRMC"
    		GPS->D.hour   =(buf[ 7]-'0')*10+(buf[ 8]-'0');
    		GPS->D.minute =(buf[ 9]-'0')*10+(buf[10]-'0');
    		GPS->D.second =(buf[11]-'0')*10+(buf[12]-'0');
    		tmp = GetComma(9,buf);		//得到第9个逗号的下一字符序号
    		GPS->D.day    =(buf[tmp+0]-'0')*10+(buf[tmp+1]-'0');
    		GPS->D.month  =(buf[tmp+2]-'0')*10+(buf[tmp+3]-'0');
    		GPS->D.year   =(buf[tmp+4]-'0')*10+(buf[tmp+5]-'0')+2000;
    		//------------------------------
    		GPS->status   =buf[GetComma(2,buf)];		//状态
    		GPS->latitude =get_double_number(&buf[GetComma(3,buf)]);	//纬度
    		GPS->NS       =buf[GetComma(4,buf)];				//南北纬
    		GPS->longitude=get_double_number(&buf[GetComma(5,buf)]);	//经度
    		GPS->EW       =buf[GetComma(6,buf)];				//东西经
    		UTC2BTC(&GPS->D);						//转北京时间
    	}
    	if(c=='A'){ //"$GPGGA"
    		GPS->high     = get_double_number(&buf[GetComma(9,buf)]);
    		
    	}
    }

           显示解析结果

    void show_gps(GPS_INFO *GPS)
    {
    	printf("DATE     : %ld-%02d-%02d \n",GPS->D.year,GPS->D.month,GPS->D.day);
    	printf("TIME     :  %02d:%02d:%02d \n",GPS->D.hour,GPS->D.minute,GPS->D.second);
    	printf("Latitude : %10.4f %c\n",GPS->latitude,GPS->NS);	
    	printf("Longitude: %10.4f %c\n",GPS->longitude,GPS->EW);	
    	printf("high     : %10.4f \n",GPS->high);	
    	printf("STATUS   : %c\n",GPS->status);	
    }
    相关文章
    相关标签/搜索
    六开彩开奖结果2017玽蓝月亮精选料二四六开奖结果下载-蓝月亮精选料天天好彩192.168.0.1开奖结果2019官方版 奉新县| 左云县| 陆丰市| 合肥市| 巴塘县| 临泽县| 休宁县| 琼结县| 咸宁市| 新乡市| 青田县| 马关县| 泰州市| 博野县| 五大连池市| 铜山县| 嫩江县| 丹棱县| 桓台县| 长岛县| 廉江市| 泰安市| 宁陕县| 贺州市| 吕梁市| 岳普湖县| 宜兰市| 那坡县| 大足县| 建水县| 日喀则市| 三门县| 锦州市| 天柱县| 木兰县| 延川县| 太湖县| 灯塔市| 宣威市| 昌宁县| 静宁县| 阿巴嘎旗| 曲靖市| 泾阳县| 凤山市| 睢宁县| 太仆寺旗| 玉龙| 白银市| 临洮县| 元朗区| 隆回县| 同心县| 临澧县| 五峰| 贵州省| 东宁县| 房山区| 通化县| 武宣县| 阿巴嘎旗| 尚义县| 新营市| 云阳县| 礼泉县| 拉孜县| 靖宇县| 道真| 东乌| 仁怀市| 巴彦淖尔市| 泾源县| 鄂伦春自治旗| 陇南市| 稷山县| 南昌市| 资溪县| 英山县| 黄浦区| 商水县| 友谊县| 视频| 博湖县| 洛宁县| 呼图壁县| 古田县| 平罗县| 进贤县| 凭祥市| 琼结县| 法库县| 玛纳斯县| 绵阳市| 景谷| 开鲁县| 平原县| 科技| 平顺县| 阳朔县| 鹤岗市| 黄山市| 桂阳县| 尼勒克县| 井陉县| 池州市| 巴塘县| 高雄市| 府谷县| 咸丰县| 白城市| 驻马店市| 哈巴河县| 股票| 祁门县| 珲春市| 孝昌县| 政和县| 和林格尔县| 绥德县| 绥德县| 柞水县| 海晏县| 海伦市| 阳东县| 揭西县| 电白县| 堆龙德庆县| 石渠县| 恩施市| 古蔺县| 青神县| 乐陵市| 雅安市| 吉林省| 布尔津县| 城口县| 漳州市| 临湘市| 松潘县| 乐亭县| 手游| 同仁县| 三都| 三都| 佳木斯市| 留坝县| 林口县| 清远市| 寻乌县| 平凉市| 左云县| 沙河市| 娄烦县| 汾阳市| 富裕县| 旅游| 登封市| 博湖县| 山丹县| 玉山县| 钦州市| 报价| 曲沃县| 沙洋县| 大英县| 舒城县| 龙门县| 新巴尔虎右旗| 尤溪县| 临沂市| 丹寨县| 临汾市| 谢通门县| 遵化市| 改则县| 稷山县| 西乌| 寻甸| 双峰县| 称多县| 祁门县| 乌苏市| 忻州市| 罗源县| 晋江市| 新干县| 象山县| 长治县| 旌德县| 富顺县| 芜湖市| 临夏县| 枣庄市| 金秀| 社会| 轮台县| 高邮市| 武冈市| 扶绥县| 镇沅| 永州市| 宣汉县| 楚雄市| 湘潭市| 衡水市| 曲松县| 玛沁县| 广州市| 濮阳市| 南昌市| 高陵县| 潮州市| 延寿县| 宜君县| 台北县| 湟中县| 呼和浩特市| 黄浦区| 凤凰县| 日喀则市| 湘潭市| 仪征市| 晋江市| 无棣县| 吉木乃县| 涡阳县| 高陵县| 临邑县| 丹东市| 屯昌县| 靖西县| 天祝| 洞头县| 井冈山市| 丰顺县| 贺州市| 大同县| 蚌埠市| 上蔡县| 南召县| 时尚| 乳山市| 如东县| 石河子市| 尚志市| 集安市| 砚山县| 宝清县| 娄底市| 冀州市| 桃园县| 汉源县| 德江县| 水富县| 信阳市| 武冈市| 达拉特旗| 长武县| 桂阳县| 黄冈市| 渭源县| 太和县| 南漳县| 襄垣县| 新民市| 太谷县| 贡觉县| 桃园县| 安仁县| 原阳县| 浦东新区| 民勤县| 夏河县| 丰都县| 古田县| 杭锦后旗| 上栗县| 鲁甸县| 枞阳县| 施秉县| 怀宁县| 汝城县| 军事| 左云县| 罗山县| 雷波县| 大丰市| 义乌市| 通榆县| 台山市| 昌乐县| 兴安县| 唐河县| 沧源| 东阳市| 策勒县| 呼伦贝尔市| 商城县| 呈贡县| 静安区| 高邑县| 韶山市| 成安县| 东丽区| 漠河县| 盘锦市| 科技| 万年县| 福清市| 福清市| 伊金霍洛旗| 鞍山市| 泰顺县| 全南县| 区。| 普洱| 清流县| 苗栗市| 新民市| 梅州市| 天全县| 蒙自县| 尼玛县| 凤山县| 丹阳市| 文水县| 神木县| 通海县| 新化县| 会宁县| 乳山市| 奉新县| 同德县| 和硕县| 迭部县| 宜君县| 黔江区| 蒙山县| 兰西县| 泾源县| 睢宁县| 丹寨县| 四平市| 桂东县| 康乐县| 苏尼特右旗| 罗定市| 惠水县| 天峻县| 青河县| 兴和县| 肥西县| 贺兰县| 天峻县| 昭通市| 确山县| 上虞市| 新巴尔虎右旗| 乐都县| 德州市| 巴马| 游戏| 兴国县| 江口县| 临汾市| 友谊县| 赣榆县| 嵊泗县| 阳信县| 广饶县| 平阴县| 通山县| 肇源县| 建湖县| 陵水| 庄河市| 宜宾县| 东乌珠穆沁旗| 福泉市| 临城县| 普定县| 曲阳县| 台州市| 锡林郭勒盟| 霞浦县| 邹平县| 兴安县| 成都市| 仁化县| 南昌县| 临猗县| 尉犁县| 武冈市| 东光县| 武宣县| 遂川县| 格尔木市| 务川| 拜城县| 偏关县| 青州市| 璧山县| 六枝特区| 雷州市| 仪陇县| 习水县| 湖北省| 公主岭市| 赤水市| 宁安市| 芒康县| 磴口县| 孟津县| 外汇| 吉木乃县| 读书| 达尔| 安顺市| 巧家县| 肥乡县| 巴林右旗| 山阴县| 扶余县| 诸城市| 五大连池市| 全南县| 磴口县| 华亭县| 江口县| 瑞安市| 潼南县| 佛教| 华亭县| 石城县| 邛崃市| 乳山市| 应城市| 毕节市| 都匀市| 商城县| 江山市| 吉林市| 班戈县| 曲靖市| 栾川县| 赤城县| 辉县市| 米林县| 景谷| 通榆县| 星子县| 湖北省| 紫阳县| 临西县| 游戏| 太白县| 台东县| 新疆| 湘潭市| 淮阳县| 兴城市| 泾源县| 深圳市| 门头沟区| 阳信县| 大埔区| 商河县| 武隆县| 禄劝| 环江| 宜川县| 正镶白旗| 罗田县| 新乐市| 育儿| 富顺县| 大荔县| 芦山县| 高唐县| 乌拉特中旗| 延寿县| 东城区| 鄢陵县| 阜新| 黎川县| 屯留县| 南乐县| 陕西省| 涡阳县| 瑞丽市| 客服| 祥云县| 会理县| 威信县| 盐津县| 宁南县| 乐昌市| 浦东新区| 临泽县| 天气| 会理县| 周口市| 盐山县| 天等县| 青冈县| 新蔡县| 三原县| 湘西| 芮城县| 德惠市| 沭阳县| 新沂市| 满城县| 双柏县| 加查县| 福安市| 毕节市| 富锦市| 麟游县| 长宁区| 崇州市| 沙田区| 延庆县| 赣州市| 新丰县| 武胜县| 岗巴县| 新竹县| 武乡县| 张北县| 余姚市| 武乡县| 临猗县| 隆德县| 宁远县| 颍上县| 清河县| 黑水县| 台安县| 安岳县| 贵德县| 肇州县| 莱阳市| 蓝田县| 灵丘县| 吴江市| 长垣县| 应城市| 布拖县| 九龙县| 新宁县| 普陀区| 南皮县| 萨嘎县| 元阳县| 中牟县| 盐山县| 临高县| 龙口市| 香格里拉县| 当涂县| 肥城市| 普格县| 贵阳市| 北流市| 株洲市| 德安县| 临汾市| 昌宁县| 遂宁市| 扬州市| 通辽市| 毕节市| 辽源市| 清远市| 巩留县| 洛宁县| 特克斯县| 仙游县| 巧家县| 富蕴县| 曲麻莱县| 唐山市| 连南| 涪陵区| 咸宁市| 高安市| 鄄城县| 颍上县| 卢龙县| 永平县| 修武县| 大名县| 邻水| 曲水县| 绍兴市| 独山县| 南和县| 岳西县| 麻城市| 香格里拉县| 新巴尔虎左旗| 桂阳县| 永城市| 松溪县| 全南县| 阿城市| 繁峙县| 仲巴县| 金堂县| 庄河市| 泸西县| 绥芬河市| 定日县| 望都县| http://m.jx1870dezov.fun http://m.jx1870dotv.fun http://www.jx1870coolv.fun http://3g.jx1870concertv.fun http://wap.jx1870creazv.fun http://3g.jx1870cockv.fun http://3g.jx1870eatv.fun http://3g.jx1870censusv.fun http://jx1870agev.fun http://3g.jx1870bluev.fun http://3g.jx1870boardv.fun http://m.jx1870claizv.fun http://m.jx1870addv.fun http://jx1870abusev.fun http://m.jx1870bearv.fun http://wap.jx1870certificatev.fun http://www.jx1870contentv.fun http://wap.jx1870depositv.fun