我正在研究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_reg
和gen_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
型
1条答案
按热度按时间lyr7nygr1#
你不处理CRC所在的17位零。(只要删除或注解掉输入中的那一行。)然后你的python代码输出
[0 0 0 0 0 0 1 1 0 1 0 1 1 1 1 0 1]
。