freemodbus 协议栈中 接收帧解析时 ,CRC为啥返回0才是正确的?
eMBErrorCode
eMBRTUReceive( UCHAR * pucRcvAddress, UCHAR ** pucFrame, USHORT * pusLength )
{
/* Length and CRC check */
if( ( usRcvBufferPos >= MB_SER_PDU_SIZE_MIN )
&& ( usMBCRC16( ( UCHAR * ) ucRTUBuf, usRcvBufferPos ) == 0 ) )
………………
}
MODBUS协议中CRC16校验返回0
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- 阿里嘎多学长 2024-05-31 11:50关注
以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:
CRC16(循环冗余校验)是一种常用的错误检测算法,它通过在数据块后附加一个校验码(CRC码)来检测数据在传输或存储过程中是否发生了错误。在MODBUS协议中,CRC16校验用于确保数据帧的完整性和正确性。
CRC校验的基本原理:
-
多项式表示:CRC校验基于多项式除法原理。在MODBUS协议中,使用的是CRC-16多项式,通常是0xA001(x^16 + x^15 + x^2 + 1)。
-
寄存器初始化:在开始计算CRC之前,会初始化一个16位的寄存器,通常初始化为0xFFFF。
-
数据处理:将待发送的数据按字节顺序进行处理,每次处理一个字节。
-
异或操作:将当前处理的字节与寄存器的低8位进行异或操作,更新寄存器的值。
-
循环移位和多项式相乘:将寄存器的值左移一位,如果左移后的最高位为1,则与CRC多项式进行异或操作。
-
重复处理:重复步骤4和5,直到所有数据都处理完毕。
-
校验码生成:最终寄存器的值即为CRC校验码。
-
校验码附加:将计算得到的CRC校验码附加到数据块的末尾。
-
接收端校验:接收方收到数据后,会重新计算CRC校验码,并与接收到的校验码进行比较。
为什么CRC校验返回0表示校验正确?
在许多CRC实现中,包括MODBUS协议中的CRC-16,校验码的计算结果是通过异或操作得到的。如果在数据传输过程中没有发生错误,那么计算得到的CRC校验码与接收到的校验码进行异或操作的结果应该是0xFFFF(全1)。但是,为了简化硬件实现,MODBUS协议在发送前将CRC校验码与0xFFFF进行异或操作,这样在接收端,如果数据正确,异或操作的结果应该是0x0000(全0)。因此,当CRC校验返回0时,表示校验正确。
STM32和C语言环境中的实现:
在STM32微控制器中,通常有硬件支持CRC计算,可以通过库函数或直接操作寄存器来实现CRC校验。以下是使用C语言实现CRC16的一个简单示例:
#include <stdint.h> #include <stdbool.h> // CRC16 Modbus 多项式 0xA001 uint16_t modbusCRC16(const uint8_t *data, uint16_t length) { uint16_t crc = 0xFFFF; // 寄存器初始化 for (int pos = 0; pos < length; pos++) { crc ^= data[pos]; // 异或操作 for (int i = 8; i != 0; i--) { // 处理每一位 if ((crc & 0x0001) != 0) { // 低位为1 crc >>= 1; crc ^= 0xA001; // 与多项式异或 } else { // 低位为0 crc >>= 1; } } } // 返回CRC值 return crc; }
参考资料:
- CRC校验(循环冗余校验 Cyclic Redundancy Check)以Modbus协议中的CRC-16算法为例
- Modbus-crc16校验原理和方法(含测试代码以及演算过程)
- 最详细易懂的CRC-16校验原理(附源程序)
这些资料提供了关于CRC16校验原理的详细解释和示例代码,可以帮助你更好地理解和实现CRC16校验。
解决 无用评论 打赏 举报 编辑记录 -
悬赏问题
- ¥15 mmo能不能做客户端怪物
- ¥15 osm下载到arcgis出错
- ¥15 Dell g15 每次打开eiq portal后3分钟内自动退出
- ¥200 使用python编写程序,采用socket方式获取网页实时刷新的数据,能定时print()出来就行。
- ¥15 matlab如何根据图片中的公式绘制e和v的曲线图
- ¥15 我想用Python(Django)+Vue搭建一个用户登录界面,但是在运行npm run serve时报错了如何解决?
- ¥15 QQ邮箱过期怎么恢复?
- ¥15 登录他人的vue项目显示服务器错误
- ¥15 (标签-android|关键词-app)
- ¥15 comsol仿真压阻传感器