我在使用GPS时,通过网口接收到了BESTPOS格式的输出结果,它以16进制表示。
当前常见的GPS都以ASCII表示,例如我们在串口助手中可以选择输出类型为ASCII或者是16进制,那么说明它们中见肯定存在某种转换机制,既可以表示出正负号、也可以表示出小数点后的数字,它就是IEEE754
下面是一段BESTPOS十六进制的GPS数据:
AA 44 12 1C 2A 00 00 20 48 00 00 00 8B 78 74 07 50 8F B5 06 00 00 44 00 F6 B1 2C 36 00 00 00 00 10 00 00 00 2C B3 31 89 16 0A 44 40 2B A7 F9 0F 0F 0F 5D 40 00 00 6A 14 45 1A 4E 40 33 33 1B C1 3D 00 00 00 C3 BC 3A 40 71 19 6F 40 DB 2A ED 40 00 00 00 00 00 00 00 00 00 00 00 00 08 06 06 00 00 00 00 01 27 AD 7C 33
BESTPOS数据格式
header 28 bytes --------------
AA 44 12
1C=28=>28 bytes header(Header Lgth)
2A 00=42=>bestposa(page 375 of 129 Rev8)
00=0=>Binary
20=32=>com1(page 28 of 20000129 Rev8)
48 00=>72(不包含header以及CRC的主体数据共有72个字节)
00 00=>0(Sequence)
8B=>139(Idle Time)
78=120=>COARSESTEERING(Time Status)
74 07=>1908(GPS reference week number)
50 8F B5 06=> 112562000ms
00 00 44 00(Receiver Status)
F6 B1 (Reserved)
2C 36 (Receiver S/W Version)
------------------data 76 bytes ----------------------------
00 00 00 00=0= SOL_COMPUTED
10 00 00 00= SINGLE
2C B3 31 89 16 0A 44 40=40.0788125(lat)
2B A7 F9 0F 0F 0F 5D 40=116.235294(lon)
00 00 6A 14 45 1A 4E 40= 60.205233(hgt)
33 33 1B C1=-273612.796875(undulation)
3D 00 00 00=WGS84(datum id#)
C3 BC 3A 40=2.9177711009979248046875(lat )
71 19 6F 40=1.7359278202056884765625(lon )
DB 2A ED 40=3.411481380462646484375 (hgt )
00 00 00 00 (stn id)
00 00 00 00 (diff_age)
00 00 00 00 (sol_age)
08(#SVs)
06(#solnSVs)
06(#solnL1SVs)
00(#solnMultiSVs)
00(Reserved)
00 (ext sol stat)
00(Galileo and BeiDousig mask)
01(GPS andGLONASS sigmask)
27 AD 7C 33=校验位
关键的东西来了
64位双精度浮点数规格化表示
X= (-1)s ×(1.M)× 2E-1023
实例一:现针对BESTPOSA中的十六进制纬度“2C B3 31 89 16 0A 44 40”做以转换,实例如下:
1、将“2C B3 31 89 16 0A 44 40”从右至左,从高位至低复写一遍:40 44 0A 16 89 31 B3 2C
2、将“40 44 0A 16 89 31 B3 2C”写成二进制“01000000 01000100 00001010 00010110 10001001 00110001 10110011 00101100”
3、01000000 01000100 00001010 00010110 10001001 00110001 10110011 00101100该二进制数据中红色字体“0”代指符号位S,11位绿色二进制字体“1000000 0100”代指含阶符的阶码E,52位蓝色二进制字体“0100 00001010 00010110 10001001 00110001 10110011 00101100”代指尾数M。
4、根据公式X= (-1)s×(1.M)× 2E-1023 ,
得知:5640591441507116,5626228431264431
(-1)s =(-1)0 =1
(1.M) 10=(10100 00001010 00010110 10001001 00110001 10110011 00101100) /(252)=1.2524628981729604149109036370646
E=(1000000 0100)=(1028),2(E-1023)=2(1028-1023)=25;
X= (-1)s ×(1.M)× 2(E-1023)=1×1.2524628981729604149109036370646×25= 40.078812741534733277148916386068
5、即的纬度为40.078812741534733277148916386068,同时bestposa语句里的64位双精度浮点数的经度和高度的算法同上。
我建议读者自己动手算一下,就会发现这规则还是很有意思的!遇到进制转换可以直接百度:在线进制转换器