我试图在micropython中实现和使用8位CRC,与ADC (ADS1235德州仪器)一起使用。
我已经尝试了一段时间来重写现有的程序(主要是用C实现的),并从下到上编写这个函数,但是没有效果。
下面的功能是我能找到的最接近我正在寻找的功能。我使用的CRC具有多项式0x07。
从PM 2环获取的函数--注释"1“
def crc_16_CCITT(msg):
poly = 0x8408
crc = 0xffff
for byte in msg:
for _ in range(8):
if (byte ^ crc) & 1:
crc = (crc >> 1) ^ poly
else:
crc >>= 1
byte >>= 1
return crc ^ 0xffff 我尝试使用基于PM 2环表的实现,但这也不起作用
def make_crc_table():
poly = 0x8408
table = []
for byte in range(256):
crc = 0
for bit in range(8):
if (byte ^ crc) & 1:
crc = (crc >> 1) ^ poly
else:
crc >>= 1
byte >>= 1
table.append(crc)
return table
table = make_crc_table()
def crc_16_fast(msg):
crc = 0xffff
for byte in msg:
crc = table[(byte ^ crc) & 0xff] ^ (crc >> 8)
return crc ^ 0xffff我对第一个函数的修改如下所示:
def crc_8_CCITT(msg):
poly = 0x07
crc = 0x00
for byte in msg:
for _ in range(8):
if (byte ^ crc) & 1:
crc = (crc >> 1) ^ poly
else:
crc >>= 1
byte >>= 1
return crc ^ 0x55 发布于 2022-06-10 02:05:39
对于CRC,似乎您正在尝试实现,这是一个反射CRC,您需要反映多项式。你需要poly = 0xe0。
代码可以简化一些。消息的for循环可以是:
for byte in msg:
crc ^= byte
for _ in range(8):
if crc & 1:
crc = (crc >> 1) ^ poly
else:
crc >>= 1至于这是否你真正需要的CRC,我不知道。您需要的CRC是否得到反映?初值是零吗?0x55是从哪里来的?您有您没有向我们透露的CRC说明书吗?您是否有您知道正确的CRC值的示例数据?
更新:
基于下面的注释,OP需要实现CRC-8/I-432-1。它不是一个反射的CRC,所以移位是向上的,而不是向下的,有多项式0x07,初始值为零,并且是最终的排他性或0x55。这方面的执行将是:
def crc8_itu(msg):
crc = 0
for byte in msg:
crc ^= byte
for _ in range(8):
crc = (crc << 1) ^ 7 if crc & 0x80 else crc << 1
crc &= 0xff
return crc ^ 0x55发布于 2022-06-10 10:50:29
https://stackoverflow.com/questions/72556517
复制相似问题