Modbus协议中RTU模式中的CRC校验及c语言实现

CRC 校验

由于最近要控制一个伺服电机,用到了串口modbus协议,用到的是rtu模式。协议也是起始帧加数据帧加CRC校验。特此系统记录一下crc校验。

CRC概念

首先crc就是一个附在一串报文后面的一个16位二进制的数,由发送设备计算。接受的设备在接收报文后重新计算CRC,然后把这个值和接收到的CRC数据进行对比,如果两个值相等·就校验成功,若两个值不相等,则为错误。

CRC计算方式

CRC的计算,首先对一个16位寄存器预装全1,然后将报文中连续的8位子节对其进行后续的计算。起始位停止位一般不参与CRC计算。
1: 把一个16位寄存器全部装入1,FFFF将这个寄存器称为CRC寄存器。
2: 把报文的第一个八位字节和16位CRC寄存器低字节异或,结果置于CRC寄存器。
3:把CRC寄存器右移一位,MSB充零(最高有效位),提取并检测LSB。
4:如果LSB(最低位)是0则继续第三步,如果是1则对CRC寄存器.
5: 重复3和4两个步骤,直到完成8次移位。
6:对报文中2-5步骤重复,直到所有报文被处理。
7: CRC寄存器中生成最终的CRC校验码
8:当CRC值放在报文中的时候高低字节必须交换位置。在这里插入图片描述

c语言实现CRC校验实例

unsigned char *data;
unsigned char length;
unsigned int crc_chk(unsigned char *data,unsigned char length)
{
 int i,j;
 unsigned int crc_reg =0xffff;
 while(length--)
 {
   crc_reg^=*data++;
   for(j=0;j<8;j++)
   {
   if(crc_reg&0x01)
    {
     crc_reg=(crc_reg>>1)^0xa001;
    }
    else
    {
    crc_reg=crc_reg>>1;
    }
    
   }
 }
 return crc_reg;
}

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值