You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PyCRC正确计算Modbus RTU的CRC校验和

问题原因

你的CRC计算传参类型完全错误:Modbus RTU的CRC16校验是对帧对应的原始二进制字节流做计算,你代码里用restOfFrame.encode()是把十六进制格式的字符串转成了ASCII编码的字节(比如字符'1'会被转成0x31、字符'0'会被转成0x30),和实际Modbus帧里的原始字节0x11、0x01、0x00、0x13、0x00、0x25没有任何关系,计算结果必然和预期不符。

修正代码

先把十六进制字符串按每两位对应一个字节的规则转成原始字节流,再传入CRC计算函数即可:

from PyCRC.CRC16 import CRC16

def checksum(restOfFrame):
    # 移除帧字符串里可能存在的空格,再转成原始字节
    clean_hex = restOfFrame.replace(" ", "")
    raw_frame = bytes.fromhex(clean_hex)
    return CRC16(modbus_flag=True).calculate(raw_frame)

print(hex(checksum('110100130025')))
# 运行输出为0xe84,和预期的0x0E84完全一致
注意事项
  • Modbus RTU帧中传输CRC校验值时遵循低字节在前、高字节在后的规则,比如本次算出的0x0E84,在帧里的存放顺序是0x84 0x0E,不要搞反顺序导致校验失败。
  • 如果你后续直接处理字节类型的帧数据,不需要做十六进制转字节的步骤,直接传入字节对象即可计算。

内容的提问来源于stack exchange,提问作者PhilM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 12:45:41