numpy 如何计算ISO CAN-FD帧的CRC

kmbjn2e3  于 2024-01-08  发布在  其他
关注(0)|答案(1)|浏览(93)

我正在研究ISO CAN-FD中的CRC,但我对实际检查序列的计算有问题。
首先,我仔细阅读了ISO 11898-1:2015规范,它说明了如何进行计算。
然后,我定义了一个帧来尝试计算CRC:
x1c 0d1x的数据
请注意,红色的零是填充位。
相同的帧已添加到CANALZYER配置中,我的CAPL脚本打印FrameCRC = 0x6bd
我已经使用Numpy实现了ISO文档中描述的算法,但我的结果与CANalyzer返回的结果不匹配。
我的代码如下(它可能不是完美的numpy-ic编码,我是这个库的新手):

def crc(data):
    gen_poly = np.array([1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1])
    crc_reg = np.array([1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

    for bit in data:
        crc_next = abs(bit - crc_reg[0])
        crc_reg = np.roll(crc_reg, -1)      # Shift one position left (1)
        crc_reg[-1] = 0                     # Shift one position left (2)
        if crc_next == 1:
            reg_new = abs(crc_reg - gen_poly)
            crc_reg = np.copy(reg_new)
    return crc_reg.copy()

字符串
我还想,也许我误解了文档,crc_reggen_poly必须是18位长。所以我修改了代码如下:

  • 在帧的末尾在零处添加18位,而不是17位;
  • gen_poly = np.array([1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1]) ;
  • crc_reg = np.array([1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])(共18位);

但是效果不太好。我真的不知道我哪里出错了。我已经把所有的东西都复习了很多遍了。
编辑:正如@Reinderien所建议的,我提供了输入数据和预期的输出数组:

input_data = np.array([
    0,  # SOF
    1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0,    # ID
    0,  # RTR
    0,  # IDE
    1,  # EDL
    0,  # RES
    1,  # BRS
    0,  # ESI
    1, 0, 0, 0,     # DLC
    1, 1, 1, 1, 1, 0, 1, 1, 1,          # Byte 1
    1, 1, 0, 1, 1, 1, 1, 1, 0, 1,       # Byte 2
    1, 1, 1, 1, 0, 1, 1, 1, 1,          # Byte 3
    1, 0, 1, 1, 1, 1, 1, 0, 1, 1,       # Byte 4
    1, 1, 1, 0, 1, 1, 1, 1, 1, 0,       # Byte 5
    1, 1, 1, 1, 1, 0, 1, 1, 1,          # Byte 6
    1, 1, 0, 1, 1, 1, 1, 1, 0, 1,       # Byte 7
    1, 1, 1, 1, 0, 1, 1, 1, 1,          # Byte 8
    1, 1, 0, 0,     # StuffCount + Parity
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0     # 17 bits at zero
])

expected_output = np.array([0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1])    # 0x6bd

lyr7nygr

lyr7nygr1#

你不处理CRC所在的17位零。(只要删除或注解掉输入中的那一行。)然后你的python代码输出[0 0 0 0 0 0 1 1 0 1 0 1 1 1 1 0 1]

相关问题