【发布时间】:2021-08-03 05:22:06
【问题描述】:
我是意大利人,很抱歉我的英语不好。 我正在分析 DPS5020 电源模块中使用的 MODBUS 协议(rs232 com 端口),无法理解 RTU 模式下的 CRC 计算方法(第 3 页)https://cloud.kyme32.ro/ftp_backup/DPS5020%20PC%20Software(2017.11.04)/DPS5020%20CNC%20Communication%20%20Protocol%20V1.2.pdf。 在第 4 页上用于发送字节 1、3、0、2、0、2 的第一个示例中,指示值 CRC = 65CB(十六进制)(交换了 2 个字节)。 我还尝试了几个在线 CRC 计算器,但找不到正确的值。 我也做了一个计算和位的正确旋转的分步图,但是值没有返回给我。 是需要使用帧的所有字节(6)进行计算还是只使用数据值(4)?我都试过了都没有成功... 能否请您放一张关于如何完成计算和逐步返回值的小图(16位异或与A001值,向右旋转是/否......等)? 我知道最后你必须在它们之间交换 2 个字节,但是单个值无论如何都不会回到我这里。 还是仅仅是手册印刷错误? 我真的很沮丧。非常感谢。
#已解决 DPS5020 文档(通信协议)中的错误解释:该文档指出应该在位右移之后而不是之前检查 LSB !!!!!!
错误的解释
- 在 CRC 生成期间,每个 8 位字符都与寄存器的内容进行异或。
- 结果向最低有效位 (LSB) 的方向移动,在最高有效位 (MSB) 的位置插入零。
- 提取并检查 LSB。
- 如果 LSB 为 1,则寄存器的异或 (XOR) 与固定预设值发生。
- 如果 LSB 为 0,则不会发生异或 (XOR)。
公平解释
- 在 CRC 生成期间,每个 8 位字符都与寄存器的内容进行异或。
- LSB 被提取并检查(我的魔法位)。
- 结果向最低有效位 (LSB) 的方向移动,在最高有效位 (MSB) 的位置插入零。
- 如果之前提取的 LSB(我的魔法位)为 1,则寄存器的异或 (XOR) 与固定的预设值发生。
- 如果之前提取的 LSB(我的魔法位)为 0,则不会发生异或 (XOR)。
非常感谢 Mark Adler 的支持。
【问题讨论】:
-
输入
010300020002here 生成预期的 CRC-16,65 CB和01030002000265CB被成功解析为 RTU 请求,在 this parser 中(如果你更改它的 CRC将失败)。 this spec 中的第 6.2.2 节包含一个可能有所帮助的工作示例。如果您编辑您的问题并添加您的尝试,那么有人可能会发现问题。