簡體   English   中英

將十六進制CANbus消息轉換為GPS long / lat

[英]Converting Hex CANbus message to GPS long/lat

我正在尋找將CAN數據包從PCAN-GPS單元轉換為長/緯度GPS坐標的幫助。
例如,我收到經度的Data = 90F98E400A0045,並且包裝采用以下格式: imgur鏈接

因此,我從Google Maps獲得了與我的位置相匹配的度數和指示器部分,但是當我嘗試將十六進制值轉換為浮點數時,我得到的是不是經度值的巨大或微小的浮動值。

我用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))

更為有效的解決方案是使用struct.unpack()函數。

Python 3.5.x的解決方案

1-將從CANbus記錄的二進制數據存儲在字節對象中。

tCanLng1=bytes([0xE8, 0x5F, 0x8F, 0x40, 0x0A, 0x00, 0x45])

2-定義GPS_PositionLongitude結構的格式說明符。

對於GPS_LongitudeMinutes (浮點數)為'f' (4個字節)。

對於GPS_LongitudeDegree (int16)為'h' (2個字節)。

對於GPS_IndicatorEW (字符)為'c' (1個字節)。

字節對齊的結尾(小尾數)添加為第一個說明符'<'

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°東

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM