空间定位系统

  • 格式:doc
  • 大小:270.54 KB
  • 文档页数:19

空间定位系统实验报告姓名:喻富炜班级:0421202学号:2012211640实验要求:1、查找GPS的NMEA协议相关资料。

2、根据GPS_DATAS.TXT文件中的数据,编写程序分析出gps数据提供的信息:卫星颗数、经度、纬度、高度、航向角、速度等。

一、解题分析:(1)分析 GPS_DATAS.TXT$GPGGA,025620.00,2602.33721,N,11911.49176,E,2,04,1.63,1 3.5,M,9.9,M,,0000*5D$GPRMC,025620.20,A,2602.33722,N,11911.49176,E,0.100,,28 1211,,,D*79$GPGGA,025620.20,2602.33722,N,11911.49176,E,2,04,1.63,1 3.3,M,9.9,M,,0000*5A$GPRMC,025620.40,A,2602.33723,N,11911.49174,E,0.098,,28 1211,,,D*7C$GPGGA 是GPS固定数据输出语句$GPGGA,025620.00,2602.33721,N,11911.49176,E,2,04,1.63,1 3.5,M,9.9,M,,0000*5D其标准格式为:$GPGGA,(1),(2),(3),(4),(5),(6),(7),(8),(9),M,(10),M,(11),(12)*hh(CR)(LF)各部分所对应的含义为:(1)定位UTC时间:02时56分20秒(2)纬度(格式ddmm.mmmm:即dd度,mm.mmmm分);(3)N/S(北纬或南纬):北纬26度02.33721分;(4)经度(格式dddmm.mmmm:即ddd度,mm.mmmm分);(5)E/W(东经或西经):东经119度11.49176分;(6)质量因子(0=没有定位,1=实时GPS,2=差分GPS):2=差分GPS;(7)可使用的卫星数(0~8):可使用的卫星数=04;(8)水平精度因子(1.0~99.9);水平精度因子=1.63;(9)天线高程(海平面,-9999.9~99999.9,单位:m);天线高程=13.5m);(10)大地椭球面相对海平面的高度(-999.9~9999.9,单位:m):9.9m;(11)差分GPS数据年龄,实时GPS时无:无;(12)差分基准站号(0000~1023),实时GPS时无:无; 。

$GPRMC,025620.20,A,2602.33722,N,11911.49176,E,0.100, ,281211,,,D*79其标准格式$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11> ,<12>*hh<1> 定位UTC时间,02时56分10秒(时分秒.毫秒)格式<2> 定位状态,A=有效定位,V=无效定位<3> 纬度(格式ddmm.mmmm:即dd度,mm.mmmm分);<4> N/S(北纬或南纬):北纬26度2.33722分;<5> 经度(格式ddmm.mmmm:即dd度,mm.mmmm分);<6> E/W(东经或西经):东经119度11.49176分;<7> 地面速率 0.100;<8> 地面航向(000.0~359.9度,以正北为参考基准,前面的0也将被传输) 无;<9> UTC日期,ddmmyy(日月年)格式即11年12月28日;<10> 磁偏角(000.0~180.0度,前面的0也将被传输) 无;<11> 磁偏角方向,E(东)或W(西) 无;<12> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)二、任务分析根据GPS_DATAS.TXT文件中的数据,编写程序分析出gps数据,输出屏幕显示并写入文档保存。

实现过程:读入GPS_DATAS.TXT将按照遇到‘,’字符便拆分的原则,将各项信息存放于一二维字符串数组中,再根据各部分的含义检索该二维数组,并存放于不同字符串。

最后根据显示习惯将字符串输出并写入文件。

三、源程序清单#include <stdio.h>#include <string.h>char GPSDATA[500];FILE *fp1;void main(){ void rx_gga(int n);void rx_rmc(int n);FILE *fp;int i=0,len;if((fp=fopen("c:\\a\\GPSDATAS.TXT","r"))==NULL){printf("can't open the file\n");exit(0);}for(;(GPSDATA[i++]=fgetc(fp))!=EOF;)putchar(GPSDATA[i-1]);len=i;/*read the data into array GPSDATA */for(i=0;i<len;i++){ if(GPSDATA[i]=='G'&&GPSDATA[i+1]=='G'&&GPSDATA[i+2]= ='A')rx_gga(i+3);if(GPSDATA[i]=='R'&&GPSDATA[i+1]=='M'&&GPSDATA[i+2]=='C ')rx_rmc(i+3);}fclose(fp);getch();}void rx_gga(int n){ int i,j,k;char *p=GPSDATA;char ch[14][14]= {'\0'};char chhour[5]={'\0'};/*定义小时*/char chmin[5]={'\0'};/*定义分钟*/char chsec[8]={'\0'};/*定义秒*/char wdu[10]={'\0'},wfen[10]={'\0'};/*定义纬度°和分*/char jdu[10]={'\0'},jfen[10]={'\0'};/*定义经度°和分*/char dingwei[14]={'\0'};/*质量因子*/char weixingsu[8]={'\0'};/*可使用的卫星数*/char suiping[8]={'\0'};/*水平精度因子*/char tianxian[10]={'\0'};/*天线高程*/char haiba[10]={'\0'};/*大地椭球面相对海平面的高度*/char gpsage[8]={'\0'};/*差分GPS数据年龄*/char gpsnumber[8]={'\0'};/*差分基准站号*/char dongxi[10]={'\0'},nanbei[10]={'\0'} ;/*定义东西经度南北纬*/for(k=0;k<14;k++){for(n=n+1,j=0;n<500;n++)if(GPSDATA[n]!=','){ ch[k][j]=*(p+n);j++; }elsebreak;} /*整体解析HHMMSS*/ for(j=0,i=0;j<2;j++,i++)chhour[j]=ch[0][i];for(j=0;j<2;i++,j++)chmin[j]=ch[0][i];for(j=0;j<5;i++,j++)chsec[j]=ch[0][i]; /*进一步解析HHMMSS中的HH,MM,SS*/for(j=0,i=0;j<2;j++,i++)wdu[j]=ch[1][i];for(j=0;j<8;i++,j++)wfen[j]=ch[1][i]; /*进一步解析纬度(格式ddmm.mmmm:即dd度,mm.mmmm分)的dd,mm.mmmm*/for(j=0,i=0;j<2;j++,i++)jdu[j]=ch[3][i];for(j=0;j<8;i++,j++)jfen[j]=ch[3][i]; /*进一步解析经度(格式ddmm.mmmm:即dd度,mm.mmmm分)*/for(i=j=0;j<8;i++,j++)nanbei[j]=ch[2][i];for(i=j=0;j<8;i++,j++)dongxi[j]=ch[4][i];if((int)(ch[5][0])==48) strcpy(dingwei,"NO POINT"); else if((int)(ch[5][0])==49) strcpy(dingwei,"SHISHIGPS");else if((int)(ch[5][0])==50) strcpy(dingwei,"CHAFEN GPS");for(i=0,j=0;j<8;i++,j++) weixingsu[j]=ch[6][i]; /*可使用的卫星数 */for(i=j=0;j<8;i++,j++) suiping[j]=ch[7][i]; /*水平精度因子*/for(i=j=0;j<8;i++,j++) tianxian[j]=ch[8][i]; /*天线高程*/for(i=j=0;j<8;i++,j++) haiba[j]=ch[10][i]; /*大地椭球面相对海平面的高度*/for(i=j=0;j<5;i++,j++) gpsage[j]=ch[12][i]; /*差分GPS数据年龄*/for(i=j=0;j<5;i++,j++) gpsnumber[j]=ch[13][i]; /*差分基准站号(0000~1023)*/fp1=fopen("c:\\a\\c.txt","a+");fprintf(fp1,"time:\t%s:%s:%s\nWEIDU:\t%s\t%sD\t%s\njing du:%s\t%sDU\t%s\ndingweiqingkuang:\t%s\nkeshiyondeweixingsu:\t%s\nsuipin gjingduyinzi:\t%s\ntianxiangaocheng:\t%sM\nhaiba:\t%sM\ngpsage:\t%s\nchafennumer:\t%s\n",chhour,chmin,chsec,nanbei,wdu,wfen,dongx i,jdu,jfen,dingwei,weixingsu,suiping,tianxian,haiba,gps age,gpsnumber);fclose(fp1);printf("time:\t%s:%s:%s\nWEIDU:\t%s\t%sD\t%s\n jingdu:%s\t%sDU\t%s\n dingweiqingkuang:\t%s\n keshiyondeweixingsu:\t%s\n suipingjingduyinzi:\t%s\n tianxiangaocheng:\t%sM\nhaiba:\t%sM\ngpsage:\t%s\nchafennumer:\t%s\n",chhour,chmin,chsec,nanbei,wdu,wfen,dongxi ,jdu,jfen,dingwei,weixingsu,suiping,tianxian,haiba,gpsa ge,gpsnumber);}void rx_rmc(int n){ int i,j,k;char *p;char ch[140][140]= {'\0'};char chhour[5]={'\0'};/*定义小时*/char chmin[5]={'\0'};/*定义分钟*/char chsec[10]={'\0'};/*定义秒*/char dingwei[10]={'\0'};/*定位状态,A=有效定位,V=无效定位 */char wdu[10]={'\0'},wfen[10]={'\0'};/*定义纬度°和分*/char jdu[10]={'\0'},jfen[10]={'\0'};/*定义经度°和分*/char suli[10]={'\0'};/*地面速率(000.0~999.9节,前面的0也将被传输) */char hangxiang[8]={'\0'};/*地面航向(000.0~359.9度,以正北为参考基准,前面的0也将被传输) */char year[10]={'\0'};char month[10]={'\0'};char date[10]={'\0'};/*UTC日期,ddmmyy(日月年)格式*/char cipian[10]={'\0'};/*磁偏角(000.0~180.0度,前面的0也将被传输) */char fangxiang[10]={'\0'};/*E(东)或W(西) */char mode[10]={'\0'};/* 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)*/char dongxi[10]={'\0'},nanbei[10]={'\0'} ;/*定义东西经度南北纬*/p=GPSDATA;for(k=0;k<14;k++){for(n=n+1,j=0;n<500;n++) /*j清0是为了再次的循环(第二次乱码的原因)*/if(GPSDATA[n]!=','){ ch[k][j]=*(p+n);j++; }elsebreak;}for(j=0,i=0;j<2;j++,i++)chhour[j]=ch[0][i];for(j=0;j<2;i++,j++)chmin[j]=ch[0][i];for(j=0;j<5;i++,j++)chsec[j]=ch[0][i]; /*进一步解析HHMMSS中的HH,MM,SS*/for(j=0,i=0;j<2;j++,i++)date[j]=ch[8][i];for(j=0;j<2;i++,j++)month[j]=ch[8][i];for(j=0;j<2;i++,j++)year [j]=ch[8][i]; /*UTC日期,ddmmyy(日月年)格式*/for(j=0,i=0;j<2;j++,i++)wdu[j]=ch[2][i];for(j=0;j<8;i++,j++)wfen[j]=ch[2][i]; /*进一步解析纬度(格式ddmm.mmmm:即dd度,mm.mmmm分)的dd,mm.mmmm*/jdu[j]=ch[4][i];for(j=0;j<8;i++,j++)jfen[j]=ch[4][i]; /*进一步解析经度(格式ddmm.mmmm:即dd度,mm.mmmm分)*/for(i=j=0;j<8;i++,j++)nanbei[j]=ch[3][i];for(i=j=0;j<8;i++,j++)dongxi[j]=ch[5][i];if((int)(ch[1][0])=='A') strcpy(dingwei,"use"); else if((int)(ch[1][0])=='V') strcpy(dingwei,"useless");for(i=j=0;j<8;i++,j++)suli[j]=ch[6][i];for(i=j=0;j<8;i++,j++)hangxiang[j]=ch[7][i];cipian[j]=ch[9][i];for(i=j=0;j<8;i++,j++)fangxiang[j]=ch[10][i];for(i=j=0;j<8;i++,j++)mode[j]=ch[11][i];fp1=fopen("c:\\a\\d.txt","a+");fprintf(fp1,"date:%s-%s-%s\ntime:%s:%s:%s\ndingweiqingk uang:%s\nweidu:%s\t%sDU%s\njingdu:%s\t%sDU%s\ndimiansuli:%s\ndimianhangxiang:%s\ ncipianjiao:%s\ncipianfangxiang:%s\nmode:%s\n",year,month,date,chhour,chmin,c hsec,dingwei,nanbei,wdu,wfen,dongxi,jdu,jfen,suli,hangx iang,cipian,fangxiang,mode);fclose(fp1);printf("date:%s-%s-%s\ntime:%s:%s:%s\ndingweiqingkuang:%s\nweidu:%s\t%s DU%s \njingdu:%s %s DU%s\ndimiansuli:%s\ndimianhangxiang:%s\ncipianjiao:%s\ ncipianfangxiang:%s\nmode:%s\n",year,month,date,chhour,chmin,c hsec,dingwei,nanbei,wdu,wfen,dongxi,jdu,jfen,suli,hangx iang,cipian,fangxiang,mode);}四、运行测试分析。