大功率无感电阻
NEWS

Modbus-RTU-crc16验证方法C语言实现

为了确保消息数据的完整性,除了验证消息CRC之外,建议实现一个代码,该代码检查串行端口(UART)中是否存在帧错误。

如果接收到的消息中的CRC与接收设备计算出的CRC不匹配,则应忽略该消息。

以下C语言代码段显示了如何使用逐位移位和XOR操作来计算Modbus消息CRC。

使用消息帧中的每个字节,除了包含CRC本身的最后两个字节以外,计算CRC。

1. CRC16校验码的使用现在,选择最常用的CRC-16校验来解释如何使用它。

根据Modbus协议,常规485通信的信息发送形式如下:地址功能码数据信息校验码1byte 1byte nbyte 2byte CRC check是先前数据内容的校验值,为16位数据,当发送,! ! ! !低8位在前,高8位在后。

这是重要的一点! ! ! !例如:信息字段代码为:1011001,检查字段为:1010。

发件人:发送的传输字段为:1 0 1 1 0 0 1 1 0 0信息字段检查字段收件人:使用相同的计算方法进行计算信息字段的校验码,并将其与接收到的实际校验码进行比较,如果信息相等且信息正确,则信息不正确;或者将所有接收到的信息除以多项式,如果可以将其除以则信息是正确的。

2. CRC16校验码的计算方法常用的查表法和计算方法。

通常的计算方法为:(1)预设一个16位寄存器值0xFFFF,并将该寄存器称为CRC寄存器; (2)将第一个8位二进制数据(即,通信信息帧的第一个字)段与16位CRC寄存器的低8位进行XOR运算,将结果放入CRC寄存器,然后将结果存入CRC寄存器。

高八位数据保持不变; (3)将CRC寄存器的内容向右移一位(向高位),并用0填充最高位。

(4)如果移位的位为0:重复步骤3(再次向右移一位);如果移位的位为1,则将CRC寄存器与多项式(A001)进行XOR运算(5)重复步骤3和4,直到向右移位8次为止,从而已处理了整个8位数据; (6)重复步骤2至5,以处理通信信息帧的下一个字节; (7)按照上述步骤计算出通信信息帧的所有字节后,交换得到的16位CRC寄存器的高字节和低字节; (8)最后获得的CRC寄存器的内容为CRC码。

上述计算步骤中的多项式A001是8005逐位求反的结果。

高字节和低字节交换缺少一句话! ! ! -------------------------------------------------未签名整数CRC16; #define SEED 0xFFFF //初始化CRC16 #define GP 0xA001 //生成多项式//对于标准CRC16 //(除法除法)//开始一个新的CRC,设置CRC16 = SEED //然后对每个字节调用Calc_CRC(字节& amp; CRC16); // CRC16将包含结果///(如果计算所有传入数据// INCLUDING CRC,则结果应为0x0000 // //如果要发送CRC,请确保//以正确的顺序发送字节)void Calc_CRC(unsigned byte b,unsigned int * CRC){BOOL进位;我CRC [0] ^ = b& amp; 0xFF;对于(i = 0; i& lt; 8; i ++){进位= CRC [0]& amp; 0x0001; CRC [0]& gt; = 1; if(carry)CRC [0] ^ = GP;}} ----------- ------------------------- -------------这个代码是正确的! ! ! ! unsigned int CRC16_2(unsigned char * buf,int len){unsigned int crc = 0xFFFF; for(int pos = 0; pos& lt; len; pos ++){crc ^ =(unsigned int)buf [pos]; //将XOR字节写入最小sig。

//(int i = 8; i!= 0; i--)的crc字节//循环遍历每个位{if((crc& amp; 0x0001)!= 0)//如果设置了LSB {crc& ; gt;> = 1; //向右移动并XOR 0xA001 crc ^ = 0xA001;}否则//未设置其他LSB {crc& gt;& == 1; //仅向右移动}}} //高低字节转换crc =((crc& amp; 0x00ff)& lt;& lt; 8)| ((crc& amp; 0xff00)& gt; 8);返回crc;您也可以加入并共享。

免责声明:本文内容经21ic授权后发布,版权归原作者所有。

该平台仅提供信息存储服务。

本文仅代表作者的个人观点,并不代表该平台的立场。

如有任何疑问,请与我们联系,谢谢!

欢迎您的咨询