今天用到了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"通过上面函数计算出来的校验和。