将Hex CANbus消息转换为GPS long / lat

时间:2016-11-06 16:27:34

标签: python gps hex data-conversion can-bus

我正在寻找帮助将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))

1 个答案:

答案 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°东