【发布时间】:2021-11-20 22:46:29
【问题描述】:
首先,对不起!我是初学者...
我在 modbus 上得到以下字节序列:“01 04 08 00 00 00 09 00 00 00 00 f8 0c”。此字节序列上的粗体 CRC 是正确的。但是,要检查/创建 CRC,我必须遵循以下设备规范:
必须使用 16 位 CRC 来完成错误检查,该 CRC 实现为两个 8 位字节。 CRC 作为最后一个字段附加到帧中。首先附加 CRC 的低位字节,然后是高位字节。因此,CRC 高位字节是帧中要发送的最后一个字节。用于生成 CRC 的多项式值必须为 0xA001。
现在,如何使用 crcmod 检查 CRC? 我的代码是:
import crcmod
crc16 = crcmod.mkCrcFun(0x1A001, rev=True, initCrc=0xFFFF, xorOut=0x0000)
print crc16("0104080000000900000000".decode("hex"))
我尝试了所有方法,但无法获得字节序列上正确的“f8 0C”...
【问题讨论】:
-
您可以使用这里提到的预先计算的 crc digi.com/resources/documentation/digidocs/90001537/references/…。它将节省计算能力。这个也应该工作github.com/Kalebu/crc16-modbus-in-Python
-
要将十六进制字符串转换为字节序列,请使用
codecs.decode("0104080000000900000000", "hex") -
添加了
[python-2.x]标签,因为'00'.decode('hex')在 3.x 中无效。现代拼写是bytes.fromhex('00')。 -
"我尝试了所有方法,但无法得到字节序列上正确的 "f8 0C"..." 你得到什么结果 ?文档对如何使用
crcmod.mkCrcFun有什么说明?当你写0x1A001, rev=True, initCrc=0xFFFF, xorOut=0x0000时,你是如何选择这些值的,这与你的问题规范有什么关系? -
你得到了什么价值? 0x0CF8 是十进制的 3320。这就是我希望您打印的内容。
标签: python python-2.x crc modbus