作者:haomingHu
email:hhm_master@163.com
背景:最近需要在imx6ull 的Linux板子上面接收定位模块的0183格式的数据并进行解析,并且用QT实现,绘制定位信息各种数据的动态曲线图
GPS NMEA协议,0183 定位数据格式 双模定位:GNXXX GPS+BD
如果是GN开头的数据则不做区分,如果是GP或者BD开头的数据则要进行区分。
数据帧格式:
$aaccc,ddd,ddd,…,ddd*hh
1、“$”——帧命令起始位
2、aaccc——地址域,前两位为识别符,后三位为语句名
3、ddd…ddd——数据
4、“*”——校验和前缀
5、hh——校验和(check sum),$与 * 之间所有字符 ASCII 码的校验和(各字节做异或运算,得到校验和后,再转换 16 进制格式的 ASCII 字符。)
6、<CR><LF>——CR(Carriage Return) + LF(Line Feed)帧结束,回车和换行
数据种类:
-
GNZDA:UTC 时间和日期
-
GNGGA:UTC时间信息
-
GPGLL:地理定位信息
-
GPGSA:当前GPS卫星信息
-
BDGSA:当前北斗卫星信息
-
GPGSV:GPS可见卫星信息
-
BDGSV:北斗可见卫星信息
-
GNRMC:推荐定位信息
-
GNVTG:地面速度信息
1. GNZDA:时间信息:
UTC 时间和日期 :这里的UTC时间是指协调世界时,相当于本初子午线(0经度上的时间),和北京时间差8个小时
数据示例: $GNZDA,092320.000,25,04,2021,00,00*40
帧格式:$GPZDA, <1>,<2>,<3>,<4>,<5>*hh
数据说明:
- <1> :UTC时间,dd:dd:dd.ddd —> 时分秒
- <2>:日
- <3>:月
- <4>:年
- <5>:地方时与世界时之差
- <6>: 检校位 *hh
2. GNGGA:卫星定位信息
数据示例:$GNGGA,092320.000,2519.0490,N,11024.8391,E,1,23,0.7,175.7,M,0.0,M,*7D
$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*hh
- <1> UTC 时间,hhmmss(时分秒)格式 和GNZDA的UTC一样,属于协调世界时
- <2> 纬度 ddmm.mmmm(度分)格式(前面的 0 也将被传输)
- <3> 纬度半球 N(北半球)或 S(南半球)
- <4> 经度 dddmm.mmmm(度分)格式(前面的 0 也将被传输)
- <5> 经度半球 E(东经)或 W(西经)
- <6> GPS 状态:0=未定位,1=非差分定位,2=差分定位,6=正在估算
- <7> 正在使用解算位置的卫星数量(00~12)(前面的 0 也将被传输)
- <8> HDOP 水平精度因子(0.5~99.9)
- <9> 海拔高度(‐9999.9~99999.9)
- <10> 地球椭球面相对大地水准面的高度
- <11> 差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空)
- <12> 差分站 ID 号 0000~1023(前面的 0 也将被传输,如果不是差分定位将为空)
重点:
经纬度转化方法:比如给出的数据中,可以得到纬度是 2519.0490 N,那么实际的纬度=25+19.0490÷60,得到的经度是11024.8391,那么实际的经度是:110+24.8391÷60 因为报文里面用的是标准的度分格式,由于经纬的范围分别是090、0180,所以切割位置也不一样
3. GPGLL:地理定位信息
示例数据:$GNGLL,2519.0490,N,11024.8391,E,092320.000,A,A*4A
$GNGLL,<1>,<2>,<3>,<4>,<5>,<6>,<7> * hh
- <1>纬度 ddmm.mmmmm (度分)
- <2> 纬度半球N (北半球)或S (南半球)
- <3>经度 dddmm.mmmmm (度分)
- <4> 经度半球E (东经)或W (西经)
- <5> UTC 时间: hhmmss (时分秒)
- <6>定位状态, A=有效定位,V=无效定位
- <7> 模式指示(A=自主定位,D=差分,E=估算,N=数据无效)
4. GPGSA:当前GPS卫星信息
示例数据:$GPGSA,A,3,09,17,33,02,34,06,14,36,19,35,04,28,1.2,0.7,1.0*3B
$GPGSA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>,<13>,<14>,<15>,<16>,<17>*hh
-
<1> 模式 2:M = 手动, A = 自动。
-
<2> 模式 1:定位型式 1 = 未定位,2 = 二维定位,3 = 三维定位。
-
<3> 第 1 信道正在使用的卫星 PRN 码编号
-
<4> 第 2 信道正在使用的卫星 PRN 码编号
-
<5> 第 3 信道正在使用的卫星 PRN 码编号
-
<6> 第 4 信道正在使用的卫星 PRN 码编号
-
<7> 第 5 信道正在使用的卫星 PRN 码编号
-
<8> 第 6 信道正在使用的卫星 PRN 码编号
-
<9> 第 7 信道正在使用的卫星 PRN 码编号
-
<10> 第 8 信道正在使用的卫星 PRN 码编号
-
<11> 第 9 信道正在使用的卫星 PRN 码编号
-
<12> 第 10 信道正在使用的卫星 PRN 码编号
-
<13> 第 11 信道正在使用的卫星 PRN 码编号
-
<14> 第 12 信道正在使用的卫星 PRN 码编号
-
<15> PDOP 综合位置精度因子(0.5 ‐ 99.9)
-
<16> HDOP 水平精度因子(0.5 ‐ 99.9)
-
<17> VDOP 垂直精度因子(0.5 ‐ 99.9)
-
注解:(Pseudo Random Noise,伪随机噪声码),01 至 32(前导位数不足则补 0,最多可接收 12 颗卫星信息)一定会有十二个占位数据,如果没有,则会是空,但是也算为一个占位数据,精度因子越小,则准确度越高,
**5. BDGSA:当前北斗卫星信息 **( 帧格式和GPGSA一致)
示例数据:$BDGSA,A,3,01,02,03,19,04,05,07,08,10,06,13,1.2,0.7,1.0*25
6. GPGSV:GPS可见卫星信息
示例数据:
$GPGSV,4,1,15,02,34,276,40,03,15,039,04,07,080,38,06,57,317,4577
$GPGSV,4,2,15,09,15,112,43,12,08,323,14,42,164,45,17,53,053,477E
$GPGSV,4,3,15,19,55,009,44,24,05,279,28,56,168,45,33,41,115,4374
$GPGSV,4,4,15,34,32,164,43,35,57,065,46,36,55,145,404B
$GPGSV, <1>,<2>,<3>,<4>,<5>,<6>,<7>,…,<4>,<5>,<6>,<7>*<8>
(1) GSV 语句总数。
(2)本句 GSV的编号。
(3) 可见卫星的总数(00-12, 前面的0也将被传输)。
(4)卫星编号(01~32, 前面的0也将被传输)。
(5) 卫星仰角(00-90度,前面的0也将被传输)。
(6)卫星方位角 (000~359 度,前面的0也将被传输)
(7)载噪比(00~99dB, 没有跟踪到卫星时为空)。
注:每条GSV语句最多包括四颗卫星的信息,其他卫星的信息将在下一条 $GPGSV语句中输出
7. BDGSV:北斗可见卫星信息
示例数据:
$BDGSV,3,1,12,01,42,122,46,02,48,229,39,03,62,180,45,04,29,109,406C
$BDGSV,3,2,12,05,26,251,35,06,05,164,35,07,59,159,45,08,65,340,4361
$BDGSV,3,3,12,10,80,228,44,13,61,283,44,19,41,074,48,20,05,038,*68
帧格式和GPGSV一致
8. GNRMC:推荐最小的定位信息
示例数据:$GNRMC,092320.000,A,2519.0490,N,11024.8391,E,0.00,0.00,250421,A7D
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12><13>
<1> UTC(Coordinated Universal Time)时间,hhmmss(时分秒)格式
<2> 定位状态,A=有效定位,V=无效定位
<3> Latitude,纬度 ddmm.mmmm(度分)格式(前导位数不足则补 0)
<4> 纬度半球 N(北半球)或 S(南半球)
<5> Longitude,经度 dddmm.mmmm(度分)格式(前导位数不足则补 0)
<6> 经度半球 E(东经)或 W(西经)
<7> 地面速率(000.0~999.9 节,Knot,前导位数不足则补 0)
<8> 地面航向(000.0~359.9 度,以真北为参考基准,前导位数不足则补 0)
<9> UTC 日期,ddmmyy(日月年)格式
<10> Magnetic Variation,磁偏角(000.0~180.0 度,前导位数不足则补 0)
<11> Declination,磁偏角方向,E(东)或 W(西)
<12> Mode Indicator,模式指示(仅 NMEA0183 3.00 版本输出,A=自主定位,D=差分,E=估算,N=数据无效)
<13> 校验和
9. GNVTG:地面速度信息
示例数据:$GNVTG,0.00,T,M,0.00,N,0.00,K,A*23
$GPVTG,<1>,T,<2>,M,<3>,N,<4>,K,<5>*hh
<1> 以真北为参考基准的地面航向(000~359 度,前面的 0 也将被传输)
<2> 以磁北为参考基准的地面航向(000~359 度,前面的 0 也将被传输)
<3> 地面速率(000.0~999.9 节,前面的 0 也将被传输)
<4> 地面速率(0000.0~1851.8 公里/小时,前面的 0 也将被传输)
<5> 模式指示(仅 NMEA0183 3.00 版本输出,A=自主定位,D=差分,E=估算,N=数据无效)
注解:
- 校验和:通过计算 $ 和 * 两个符号之间所有字符ASCLL码的异或运算得到,将得到的结果以ASCII字符表示
例如:例如语句: $GNZDA05555.000,08,12,2015,00,00*4C, 校验和(红色部分参与计算)计算方法为:
0X47 xor 0X4E xor 0X5A xor 0X44 xor 0X41 xor 0X2C xor 0X30 xor 0X39 xor 0X35 xor 0X35 xor 0X35 xor 0X35 xor 0X2E xor 0X30 xor 0X30 xor 0X30 xor 0X2C xor 0X30 xor 0X38 xor 0X2Cxop 0X31 xorl0X32 xor0X20 xor 0X32 xor 0X30 xor 0X31 xor 0X35 xor 0X2C xor 0X30 xor 0X30 xor 0X2C xor 0X30 xor 0X30
得到的结果就是0X4C,用ASCII表示就是4C.
本文仅供参考,如有不对,请在评论区留言,或者发送邮件