晓数微码 2024-05-31 11:50 采纳率: 0%
浏览 11

MODBUS协议中CRC16校验返回0

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 ) )
………………
}

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-05-31 11:50
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    CRC16(循环冗余校验)是一种常用的错误检测算法,它通过在数据块后附加一个校验码(CRC码)来检测数据在传输或存储过程中是否发生了错误。在MODBUS协议中,CRC16校验用于确保数据帧的完整性和正确性。

    CRC校验的基本原理:

    1. 多项式表示:CRC校验基于多项式除法原理。在MODBUS协议中,使用的是CRC-16多项式,通常是0xA001(x^16 + x^15 + x^2 + 1)。

    2. 寄存器初始化:在开始计算CRC之前,会初始化一个16位的寄存器,通常初始化为0xFFFF。

    3. 数据处理:将待发送的数据按字节顺序进行处理,每次处理一个字节。

    4. 异或操作:将当前处理的字节与寄存器的低8位进行异或操作,更新寄存器的值。

    5. 循环移位和多项式相乘:将寄存器的值左移一位,如果左移后的最高位为1,则与CRC多项式进行异或操作。

    6. 重复处理:重复步骤4和5,直到所有数据都处理完毕。

    7. 校验码生成:最终寄存器的值即为CRC校验码。

    8. 校验码附加:将计算得到的CRC校验码附加到数据块的末尾。

    9. 接收端校验:接收方收到数据后,会重新计算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;
    }
    

    参考资料:

    1. CRC校验(循环冗余校验 Cyclic Redundancy Check)以Modbus协议中的CRC-16算法为例
    2. Modbus-crc16校验原理和方法(含测试代码以及演算过程)
    3. 最详细易懂的CRC-16校验原理(附源程序)

    这些资料提供了关于CRC16校验原理的详细解释和示例代码,可以帮助你更好地理解和实现CRC16校验。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月31日

悬赏问题

  • ¥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仿真压阻传感器