modbus crc检验原理
Modbus协议使用CRC(循环冗余校验)作为数据校验机制。 CRC是一种计算数据内容的摘要值并将其附加到数据末尾的技术。 在Modbus协议中,CRC是16位数字。 CRC校验可以保证数据的完整性和准确性。
CRC校验算法的过程如下:
-
首先将数据和CRC寄存器的值置为0。
-
对于每个字节,将其和CRC寄存器的最低8位进行异或运算。
-
对于每个位,如果CRC寄存器的最低位是1,则右移一位,然后与预定义的多项式0xA001进行异或运算。
-
重复步骤2和3,直到所有字节都处理完毕。
-
最终CRC寄存器的值即为校验和。
Modbus协议在每个通信帧的末尾都进行CRC校验。 接收方可以使用相同的算法来计算CRC并将其与接收到的CRC进行比较,以确保数据的完整性。如果两个CRC值不匹配,则接收方将拒绝数据。
c语言程序实现
下面是modbus CRC 校验的 C 语言程序:
#include <stdint.h>
// 生成CRC16表
void crc16_init(uint16_t *table)
{
uint16_t crc;
for (int i = 0; i < 256; ++i)
{
crc = i;
for (int j = 0; j < 8; ++j)
{
if (crc & 0x0001)
{
crc = (crc >> 1) ^ 0xA001;
}
else
{
crc >>= 1;
}
}
table[i] = crc;
}
}
// 计算CRC16校验码
uint16_t crc16_calc(const uint8_t *buf, int len, const uint16_t *table)
{
uint16_t crc = 0xFFFF;
for (int i = 0; i < len; ++i)
{
crc = (crc >> 8) ^ table[(crc ^ buf[i]) & 0xFF];
}
return crc;
}
int main()
{
uint16_t crc_table[256];
crc16_init(crc_table);
uint8_t buf[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
uint16_t crc = crc16_calc(buf, sizeof(buf), crc_table);
return 0;
}
在上述程序中,crc16_init() 函数用于生成 CRC16 表,crc16_calc() 函数用于计算缓存区的 CRC16 校验码。
【最后一个bug】多平台都有更新和发布,大家可以一键三连,关注+星标,不错过精彩内容~