C语言编制程序练习 GPS数据处理

题材内容:

NMEA-01八三钻探是为了在不一样的GPS(满世界定位系统)导航设备中国建工总公司立统壹的BTCM(海事有线电技委)标准,由U.S.A.国家海洋电子组织(NMEA-The
National 马林e Electronics
Associa-tion)制定的一套通信协议。GPS接收机根据NMEA-01八三商事的标准规范,将地方、速度等音信经过串口传送到PC机、PDA等装备。

 

NMEA-01八3探讨是GPS接收机应当服从的标准协议,也是当前GPS接收机上使用最广泛的商谈,大部分常见的GPS接收机、GPS数据处理软件、导航软件都服从大概至少包容这几个体协会议。

 

NMEA-0183商议定义的说话非常多,不过常用的也许说包容性最广的讲话唯有$GPGGA、$GPGSA、$GPGSV、$GP卡宴MC、$GPVTG、$GPGLL等。

 

个中$GP奥迪Q5MC语句的格式如下:

    $GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50

 

这边整条语句是1个文本行,行中以逗号“,”隔离各样字段,各种字段的尺寸(长度)不1,那里的以身作则只是一种恐怕,并无法认为字段的轻重就像上述例句1样。

    字段0:$GP奥迪Q五MC,语句ID,申明该语句为Recommended Minimum Specific
GPS/TRANSIT Data(福特ExplorerMC)推荐最小定位新闻

    字段1:UTC时间,hhmmss.sss格式

    字段2:状态,A=定位,V=未定位

    字段叁:纬度ddmm.mmmm,度分格式(前导位数相差则补0)

    字段4:纬度N(北纬)或S(南纬)

    字段5:经度dddmm.mmmm,度分格式(前导位数相差则补0)

    字段6:经度E(东经)或W(西经)

    字段7:速度,节,Knots

    字段8:方位角,度

    字段9:UTC日期,DDMMYY格式

    字段10:磁偏角,(000 – 180)度(前导位数相差则补0)

    字段1壹:磁偏角方向,E=东W=西

    字段16:校验值

这里,“*”为校验和识别符,其后边的两位数为校验和,代表了“$”和“*”之间有着字符(不包含那七个字符)的异或值的十六进制值。上面那条例句的校验和是十6进制的50,也正是10进制的80。

 

指示:^运算符的成效是异或。将$和*里面具有的字符做^运算(第一个字符和第3个字符异或,结果再和第伍个字符异或,依此类推)之后的值对6553六取余后的结果,应该和*末尾的多个十陆进制数字的值相当,不然的话表明这条语句在传输中发生了不当。注意这一个十6进制值中是会冒出A-F的大写字母的。

 

明天,你的次序要读入1类别GPS输出,在那之中包括$GP大切诺基MC,也富含别的语句。在数据的最终,有一行单独的

    END

意味着数据的终结。

 

您的顺序要从中找出$GP奥迪Q5MC语句,总括校验和,找出其上将验正确,并且字段2代表已定位的话语,从中总括出时间,换算成法国首都时间。二次数据中会包括多条$GPQX56MC语句,以最终一条语句得到的法国首都时间作为结果输出。

您的主次一定会读到一条有效的$GP翼虎MC语句。

 

输入格式:

多条GPS语句,每条均以回车换行截至。最后1行是END多个大写字母。

 

出口格式:

陆位数年华,表达为:

    hh:mm:ss

其间,hh是两位数的钟点,不足两位时前面补0;mm是两位数的分钟,不足两位时前面补0;ss是两位数的秒,不足两位时前边补0。

 

输入样例:

$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50

END

 

出口样例:

10:48:13

日子限制:500ms内部存款和储蓄器限制:3三千kb

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 int main()
 5 {
 6     char a[1000] = "$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50",*p;
 7     int hour, min, sec;
 8     int check, value;
 9     do {
10         
11         gets(a);
12         p = a;
13 
14         if ( strncmp(a,"$GPRMC",6) == 0 && strncmp(strchr(a+6,','),",A",2) ) {    //这里一定要注意A定位
15             check = *(++p);
16             for ( p = p + 1; *p != '*'; p++ ) {
17                 check = check ^ *p;
18             }
19             check = check%65536;
20 
21             value = 0;
22             for ( p = p + 1; *p != '\0'; p++ )    //十六进制-->十进制
23             {
24                 if ( 'A' <= *p && *p <= 'F' )
25                     value = value * 16 + *p - 'A' + 10;
26                 else
27                     value = value * 16 + *p - '0';
28             }
29 
30             if ( (check) == value )
31             {
32                 hour = (a[7]-'0')*10+(a[8]-'0')+8;
33                 if (hour > 24)
34                     hour -= 24;
35                 min = (a[9]-'0')*10+(a[10]-'0');
36                 sec = (a[11]-'0')*10+(a[12]-'0');
37             }
38         }
39 
40     } while ( strcmp(a,"END") != 0 );
41     
42     printf("%02d:%02d:%02d\n", hour, min, sec);
43 
44     return 0;
45 }

 

相关文章