如何使用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
相关产品推荐
相关产品推荐

