将十六进制 CANbus 消息转换为 GPS long/lat
Converting Hex CANbus message to GPS long/lat
我正在寻求一些帮助,将 CAN 数据包从 PCAN-GPS 单元转换为 long/lat GPS 坐标。
例如,我收到 Data=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))
The more efficient solution is to use the struct.unpack()
function.
Python3.5.x
的解决方案
1- 将从 CANbus 记录的二进制数据存储在字节对象中。
tCanLng1=bytes([0xE8, 0x5F, 0x8F, 0x40, 0x0A, 0x00, 0x45])
2-定义GPS_PositionLongitude
结构的格式说明符。
For GPS_LongitudeMinutes
(float) is 'f'
(4 bytes).
For GPS_LongitudeDegree
(int16) is 'h'
(2 bytes).
For GPS_IndicatorEW
(char) is 'c'
(1 byte).
End for the byte alignment (little-endian) add as first specifier
'<'
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 ° East.
我正在寻求一些帮助,将 CAN 数据包从 PCAN-GPS 单元转换为 long/lat GPS 坐标。
例如,我收到 Data=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))
The more efficient solution is to use the
struct.unpack()
function.
Python3.5.x
的解决方案1- 将从 CANbus 记录的二进制数据存储在字节对象中。
tCanLng1=bytes([0xE8, 0x5F, 0x8F, 0x40, 0x0A, 0x00, 0x45])
2-定义GPS_PositionLongitude
结构的格式说明符。
For
GPS_LongitudeMinutes
(float) is'f'
(4 bytes).For
GPS_LongitudeDegree
(int16) is'h'
(2 bytes).For
GPS_IndicatorEW
(char) is'c'
(1 byte).End for the byte alignment (little-endian) add as first specifier
'<'
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 ° East.