crc校验

参考链接:https://www.cnblogs.com/esestt/archive/2007/08/09/848856.html

一、CRC校验原理

1.CRC校验全称为循环冗余校验(Cyclic Redundancy Check, CRC)。它是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,利用除法及余数的原理来作错误侦测,主要用来检测或校验数据传输或者保存后可能出现的错误,进而确保传输的数据准确无误。
2.原理:
(1)接收方与发送方先协商好一个整数n。若传输过程中信号无误,那么整数n应该是能被发送方发送的信息和接收方接受的信息整除的。因为正常来说,发送方发送的信息和接收方接受的信息应该是保持一致的。
(2)发送方在获取到要发送的数据D之后,为了保证能整除数n,需要在发送的数据后接上校验码CR,注意不是直接加,而是把D和CR都看作二进制数。例如要进行CRC-8校验,那么CR就应该是由8位二进制数组成的,这是可以把D左移八位,然后与CR进行或运算,这样就把D和CR拼接到了一起,构成了发送方要发送的信息Message。
(3)CR的选取不是任意的,它的选取与接受方和发送方协商的整数n有关,还与要发送的数据D有关。CR的构造用到了模二除法,或者说是异或运算。
例:
发送的数据为:D=1 1010 0010(b)
协商的整数为:P=1 0011 0110 (b)(P的位数:校验位+1)
校验码CR的计算方法如下:
crc校验_第1张图片这样我们就可以得到要发送的全部信息:Message=(D<<8)|CR

计算校验码CR的参考链接.

二、算法

以CRC-16校验为例
方法一:
1.确定要发送的数据D的位数m;
2.将要发送的数据D左移16位得到D1,作为被除数;
3.依据校验场景选定合适的除数P(17位);
4.D1和P异或的结果送到D1;
5.将D1左移一位后送到D1,移动次数n++;
6.n 7.D1首位为0,转5;首位为1转4;
8.校验码CR就是最后出来的D1;
9.要发送的信息Message=(D1<<16)|CR。
方法二:
1.确定要发送的数据D的位数m;
2.将要发送的数据D左移16位得到D1,作为被除数;
3.依据校验场景选定合适的除数P(16位,与法一相比,去掉了法一中的P的首位);
4.移动次数n 5.若D1首位为0,将D1左移一位送入D1,转7,否则跳过此步;
6.若D1首位为1,将D1左移一位送入D1,然后D1在和P异或,结果仍送入D1;
7.n++,转4;
8.校验码CR就是最后出来的D1;
9.要发送的信息Message=(D1<<16)|CR;
方法三:(Modbus协议中采用的CRC校验)
1.定义一个16位的无符号变量CR,初值为0XFFFF;
2.把报文的第一个八位字节和CR的低字节异或,结果送入CR;
3.若CR最低位为0,将CR右移一位送入 CR,转5,否则跳过;
4.若CR最低位为1,将CR右移一位送入 CR,然后将CR与0XA001异或的结果送入CR,否则跳过;
5: 移位次数n++,n<8则转3,否则转6;
6.重复步骤2和5,进行通讯信息帧下一个字节的处理;
7. CR中生成的即是最终的CRC校验码;
8.当CRC值放在报文中的时候高低字节必须交换位置;
Modbus协议中采用的CRC校验参考链接

你可能感兴趣的:(C,单片机)