我正在寻找帮助将CAN数据包从PCAN-GPS单元转换为长/纬度GPS坐标的帮助 例如,我收到经度数据= 90F98E400A0045,包的格式如下: imgur link
所以我从Google地图获得与我的位置匹配的度和指标部分,但是当我尝试将十六进制值转换为浮点时,我得到的是非常经常值的巨大或微小的浮动值。
我在Python中编写了这段代码(以及其他一些变体)。我的位置在德国的某个地方;)
s = ['E8', '5F', '8F', '40', '0A', '00', '45']
con = []
x = ""
def tohex(hex_string):
return ''.join('{0:04b}'.format(int(c, 16)) for c in hex_string)
def long(str):
min = str[:32]
vorz = min[:1]
mat = int(min[1:24], 2)
exp = int(min[24:32], 2)
l = (2**exp) * float("0."+mat.__str__())
deg = str[32:48]
print(int(deg,2))
return l
for e in s:
con.append(tohex(e))
x += tohex(e)
print("%.100f" % long(x))
答案 0 :(得分:0)
更有效的解决方案是使用
struct.unpack()
函数。
Python 3.5.x的解决方案
1-将从CANbus记录的二进制数据存储在一个字节对象中。
tCanLng1=bytes([0xE8, 0x5F, 0x8F, 0x40, 0x0A, 0x00, 0x45])
2-定义GPS_PositionLongitude
结构的格式说明符。
对于
GPS_LongitudeMinutes
(float)是'f'
(4个字节)。对于
GPS_LongitudeDegree
(int16)是'h'
(2个字节)。对于
GPS_IndicatorEW
(char)是'c'
(1个字节)。结束字节对齐(little-endian)添加为第一个说明符
'<'
3-然后执行CANbus二进制数据的解压缩,如下所示:
>> vCanLng=struct.unpack('<fhc',tCanLng1)
>> vCanLng
(4.480457305908203, 10, b'E')
4-您在德国的职位的结果是:
GPS_LongitudeMinutes = vCanLng[0] = 4.480457305908203
GPS_LongitudeDegree = vCanLng[1] = 10
GPS_IndicatorEW = vCanLng[2] = 'E'
GPS_PositionLongitude = 10°4.480457305908203 E =(10 + (4.480457305908203 / 60))°E = 10.0746742884318°东。