Modbus CRC16校验码在线计算器
关于Modbus CRC16
Modbus CRC16是一种用于Modbus协议的错误检测方法,通过计算数据的16位循环冗余校验码来确保数据传输的准确性。 本工具可以帮助您计算给定十六进制数据的CRC16校验码。
使用说明:输入十六进制数据(如:05 04 00 00 00 01)
数据可以空格分隔或连续输入
点击"计算CRC"按钮获取结果,结果显示30 4E,完整的Modbus RTU指令就是
05 04 00 00 00 01 30 4E
其中:05 04 00 00 00 01 是有效数据,30 4E 是校验码
这里提供Modbus CRC在线校验计算器地址:【Modbus CRC 在线计算】
以VALUER湾流IMU倾角传感器的modbus读取roll、pitch、yaw角数据为例,各位可以验证一下。
读取roll
Req >> : 05 04 00 00 00 01 30 4e
<< Resp: 05 04 02 bb 2f 7b dc读取pitch
Req >> : 05 04 00 01 00 01 61 8e
<< Resp: 05 04 02 00 fa c8 b3同时读取roll/pitch/yaw
Req >> : 05 04 00 00 00 03 b1 8f
<< Resp: 05 04 06 bb 2f 00 f8 00 85 dc 8c
CRC16计算原理
Modbus CRC16采用以下多项式进行计算:x¹⁶ + x¹⁵ + x² + 1
(十六进制表示为0xA001)
计算步骤:
- 初始化CRC值为0xFFFF
- 对于每个字节:
- 将CRC值与当前字节进行异或运算
- 对结果进行8次移位操作:
- 如果CRC的最低位为1,则左移1位后与0xA001异或
- 否则,仅左移1位
- 所有字节处理完成后,得到的CRC值即为结果(低位字节在前,高位字节在后)
C语言实现示例
uint16_t ModbusGetCRC(uint8_t* data, uint8_t count)
{uint8_t i, j, xdabit;uint16_t reg_crc = 0xFFFF;for (i = 0; i < count; i++){reg_crc ^= (uint16_t)data[i];for (j = 0; j < 8; j++){xdabit = (uint8_t)(reg_crc & 0x01);reg_crc >>= 1;if (xdabit == 1){reg_crc ^= 0xA001;} }}return reg_crc;
}
上述代码是Modbus CRC16校验的C语言实现,功能说明:
- 函数接收两个参数:数据指针
data
和数据长度count
- 初始化CRC寄存器
reg_crc
为0xFFFF - 对每个数据字节进行处理,与CRC寄存器进行异或运算
- 每个字节进行8次移位操作,根据最低位决定是否与多项式0xA001进行异或
- 返回计算得到的16位CRC校验值