【问题标题】:Reading 12bit little endian integers from can frame从 can 帧中读取 12 位小端整数
【发布时间】:2018-05-01 12:01:41
【问题描述】:

我正在读取一系列来自 python-can 的 CAN BUS 帧,表示为十六进制字符串,例如'9819961F9FFF7FC1' 我知道每一帧中的值如下所示:

Signal Startbit Length
A      0        8
B      8        4
C      12       4
D      16       12
E      28       12
F      40       16
G      56       4

每个值都是一个无符号整数,具有小端字节序。我苦苦挣扎的是如何处理 12 位信号,以及如何快速处理,因为这将实时运行。据我了解 struct.unpack 仅支持 1、2、4 和 8 字节整数。当您指定字节顺序时,Bitstring 包也仅支持全字节位串。

我显然对二进制的理解不够好,无法通过直接操作位来做到这一点,因为我一直在努力获得合理的值...

【问题讨论】:

    标签: python python-2.7 binary endianness can-bus


    【解决方案1】:

    我能够使用bitstruct 库成功且相当快速地解码帧,该库可以处理任意位数的值,如下面的代码所示。

    但是我发现如果两个信号出现在同一个字节上,我还必须交换十六进制字符的位置,如CAN frame layout。我仍然不确定为什么,但它确实有效。

    swapped_frame = frame[0:2] + frame[3] + frame[2] + frame[4:6] + frame[7] + \
    frame[6] + frame[8:]
    ba = bytearray(swapped_frame.decode('hex'))
    A,B,C,D,E,F,G = bitstruct.unpack('<u8u4u4u12u12u16u4', ba)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      • 2021-07-02
      相关资源
      最近更新 更多