版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhango5/article/details/78679694
今天用到了GPS数据,但是需要组成标准的数据包发给客户端去解析,在查看了常用的GPS数据包格式,最后选用了GPRMC字段的数据。
GPRMC数据格式很容易就可以搜索到:
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh<CR><LF>
字段 |
参数 |
格式 |
字段0 |
帧头 |
$GPRMC |
字段1 |
UTC时间 |
hhmmss.ss |
字段2 |
状态 |
A/V,A代表有效,V代表无效 |
字段3 |
纬度 |
ddmm.mmmm |
字段4 |
北纬/南纬 |
N/S,N表示北纬,S表示南纬 |
字段5 |
经度 |
ddmm.mmmm |
字段6 |
东经/西经 |
E/W,E表示东经,W表示西经 |
字段7 |
速度 |
节(knots),1 knots=1.852km/h |
字段8 |
方位角 |
度(以真北为参考基准) |
字段9 |
UTC日期 |
日月年,ddmmyy |
字段10 |
磁偏角 |
000~180度 |
字段11 |
磁偏角方向 |
E/W,东/西 |
字段12 |
模式仅NMEA0183 3.00版本输出 |
A:自动,D:差分,E:估测,N:无效 |
字段13 |
校验和 |
hh |
<CR><LF> |
回车换行 |
\r\n |
每个字段已经介绍的很清楚了,这里主要说一下校验和。
校验和是将$以后*以前(不包含$和*)的数据进行异或运算得出的十六进制数,代码如下,也很简单。
int checksum(const char* s)
{
int c = 0;
while (*s)
c ^= *s++;
return c;
}
例如:正确的数据包为" $GPRMC,080655.00,A,4546.40891,N,12639.65641,E,1.045,328.42,170809,,,A*60\r\n",则*后面的0x60是" GPRMC,080655.00,A,4546.40891,N,12639.65641,E,1.045,328.42,170809,,,A"通过上面函数计算出来的校验和。