【问题标题】:Calculating CRC16 in Python for modbus在 Python 中为 modbus 计算 CRC16
【发布时间】: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


【解决方案1】:

使用0x18005 代替0x1A001

【讨论】:

  • 我已经尝试过了,但它不起作用或者我遗漏了一些东西。你能分享你使用的代码吗?另一方面,功率计的文件明确指出使用0xA001。
  • 它对我有用。我使用了您问题中的代码,0x18005。结果是 3320。
  • 你说得对!非常感谢。
猜你喜欢
  • 1970-01-01
  • 2013-09-02
  • 1970-01-01
  • 2016-08-23
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 2020-10-27
相关资源
最近更新 更多