modbusCRC校验以及C语言实现
创始人
2024-05-31 22:46:42

modbus crc检验原理

Modbus协议使用CRC(循环冗余校验)作为数据校验机制。 CRC是一种计算数据内容的摘要值并将其附加到数据末尾的技术。 在Modbus协议中,CRC是16位数字。 CRC校验可以保证数据的完整性和准确性。

CRC校验算法的过程如下:

  1. 首先将数据和CRC寄存器的值置为0。

  2. 对于每个字节,将其和CRC寄存器的最低8位进行异或运算。

  3. 对于每个位,如果CRC寄存器的最低位是1,则右移一位,然后与预定义的多项式0xA001进行异或运算。

  4. 重复步骤2和3,直到所有字节都处理完毕。

  5. 最终CRC寄存器的值即为校验和。

Modbus协议在每个通信帧的末尾都进行CRC校验。 接收方可以使用相同的算法来计算CRC并将其与接收到的CRC进行比较,以确保数据的完整性。如果两个CRC值不匹配,则接收方将拒绝数据。

c语言程序实现

下面是modbus CRC 校验的 C 语言程序:

#include // 生成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】多平台都有更新和发布,大家可以一键三连,关注+星标,不错过精彩内容~
在这里插入图片描述

相关内容

热门资讯

苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...