【问题标题】:#SOLVED - MODBUS (RTU mode) CRC calculation... what's wrong? it's a misprint of the DPS5020 user manual?#SOLVED - MODBUS(RTU 模式)CRC 计算...怎么了?是不是 DPS5020 用户手册的印刷错误?
【发布时间】: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 !!!!!!

错误的解释

  1. 在 CRC 生成期间,每个 8 位字符都与寄存器的内容进行异或。
  2. 结果向最低有效位 (LSB) 的方向移动,在最高有效位 (MSB) 的位置插入零。
  3. 提取并检查 LSB。
  4. 如果 LSB 为 1,则寄存器的异或 (XOR) 与固定预设值发生。
  5. 如果 LSB 为 0,则不会发生异或 (XOR)。

公平解释

  1. 在 CRC 生成期间,每个 8 位字符都与寄存器的内容进行异或。
  2. LSB 被提取并检查(我的魔法位)。
  3. 结果向最低有效位 (LSB) 的方向移动,在最高有效位 (MSB) 的位置插入零。
  4. 如果之前提取的 LSB(我的魔法位)为 1,则寄存器的异或 (XOR) 与固定的预设值发生。
  5. 如果之前提取的 LSB(我的魔法位)为 0,则不会发生异或 (XOR)。

非常感谢 Mark Adler 的支持。

【问题讨论】:

  • 输入 010300020002 here 生成预期的 CRC-16,65 CB01030002000265CB 被成功解析为 RTU 请求,在 this parser 中(如果你更改它的 CRC将失败)。 this spec 中的第 6.2.2 节包含一个可能有所帮助的工作示例。如果您编辑您的问题并添加您的尝试,那么有人可能会发现问题。

标签: crc modbus


【解决方案1】:

帧中的所有字节都用于 CRC 计算。

这是 CRC 的 C 实现,它应该可以回答您关于要转移什么和异或何时的问题:

#include <stddef.h>
#include <stdint.h>

uint16_t crc16modbus_bit(uint16_t crc, void const *mem, size_t len) {
    unsigned char const *data = mem;
    if (data == NULL)
        return 0xffff;
    for (size_t i = 0; i < len; i++) {
        crc ^= data[i];
        for (unsigned k = 0; k < 8; k++) {
            crc = crc & 1 ? (crc >> 1) ^ 0xa001 : crc >> 1;
        }
    }
    return crc;
}

(调用mem等于NULL时返回初始CRC值。)

【讨论】:

  • 非常感谢..链接的文档对我来说是完美的...我工作了一点模式/模式,但我错了...在链接文档的第 41 页有完美的架构/计算流程再次感谢您,原谅我的英语不好...问候
猜你喜欢
  • 2014-03-06
  • 2021-04-20
  • 1970-01-01
  • 2016-12-30
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
  • 2019-06-17
  • 2022-08-16
相关资源
最近更新 更多