Python使用crcmod计算Modbus协议CRC16校验值无法得到正确结果求助
Modbus CRC16校验计算解决方案
你的CRC初始化参数配置是正确的,问题出在输出结果的字节序处理环节:
你当前代码计算得到的CRC整数值为3320,转换为十六进制是0x0CF8,按照Modbus协议要求的「先传低字节、后传高字节」规则,拆分后低字节为0xF8、高字节为0x0C,正好对应你需要的正确校验值f8 0c。
以下是可直接输出目标格式的实现代码:
Python2 版本
import crcmod # 该初始化参数完全符合Modbus CRC16规则:多项式0xA001、初始值0xFFFF、结果不异或 crc16 = crcmod.mkCrcFun(0x1A001, rev=True, initCrc=0xFFFF, xorOut=0x0000) data_hex = "0104080000000900000000" data_bytes = data_hex.decode("hex") crc_val = crc16(data_bytes) # 拆分高低字节,按低字节在前的格式输出 crc_low = crc_val & 0xFF crc_high = (crc_val >> 8) & 0xFF print "%02x %02x" % (crc_low, crc_high)
Python3 版本
import crcmod crc16 = crcmod.mkCrcFun(0x1A001, rev=True, initCrc=0xFFFF, xorOut=0x0000) data_hex = "0104080000000900000000" data_bytes = bytes.fromhex(data_hex) crc_val = crc16(data_bytes) crc_low = crc_val & 0xFF crc_high = (crc_val >> 8) & 0xFF print(f"{crc_low:02x} {crc_high:02x}")
运行上述代码即可直接输出f8 0c的目标结果。
内容的提问来源于stack exchange,提问作者Moacir Ferreira
相关产品推荐
相关产品推荐

