1.LabVIEW之CRC校验

版权声明:本文章仅用于学习交流,禁止商业行为。 https://blog.csdn.net/weixin_42164589/article/details/84996404

CRC的概念:

首先说一下CRC的基本概念,CRC(Cyclic Redundancy Check)官网是这样解释的:CRC是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。

循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

CRC的原理:

其原理说白了就是在要发送的数后面加上“一个数”(这个数不是随便加的,后面会说怎计算这个数,先透漏一下,这个数就叫做校验码),形成一个新的数,然后就可以发送啦!作为接收端开始接收这个数,接收到这个数以后要做的事就是,用这个数除以“另一个数”(这里的“另一个数”后面也讲,还有就是这里的除法也不是你想想中的除法,它叫模2除法,you know?),如果没有余数的话,那么恭喜,传输没有出错。

“一个数”是怎么来的?

在求“一个数”是怎么来的之前需要知道“另一个数”是怎么来的,“另一个数”你可自己随便定,你的地盘你做主,但是前提是有条件的,什么条件?你定的这个数的第一位和最后一位必须是1,you know?哈哈,我就知道你懒,你很定会说,我才懒得定呢。所以有操心认识帮你整理了一些,供你参考,说白了就是直接那个过来直接用,那么这个拿过来直接用的数,就是上面咱提的“另一个数”。可以在下面选:

  CRC-4         x4+x+1                 1 0011

   CRC-8         x8+x5+x4+1           1 0011 0001                

   CRC-8         x8+x2+x1+1            1 0000 0111              

扫描二维码关注公众号,回复: 4870526 查看本文章

   CRC-8         x8+x6+x4+x3+x2+x1       1 0101 1110

   CRC-12        x12+x11+x3+x+1         1 1000 0000 1011

   CRC-16        x16+x15+x2+1            1 1000 0000 0000 0101

...........还有其他的。

当我们选出“另一个数”后接下来的工作就是求“一个数”,怎么求啊?就是用你的原始数据用模2除法(模2 不会的就不在这讲了,其实就是异或,不会的直接去百度吧)去出刚才的“另一个数”的到的余数,就是咱们要求的“一个数”,把它加在原始数据的后面一块发出去就可以啦!!

再重复一些具体步骤:
1. 选择合适的除数
2. 看选定除数的二进制位数,然后再要发送的数据帧上面加上这个位数-1位的0,然后用新生成的帧以模2除法的方式除上面的除数,得到的余数就是该帧的CRC校验码。注意,余数的位数一定只比除数位数少一位,也就是CRC校验码位数比除数位数少一位,如果前面位是0也不能省略。
3. 将计算出来的CRC校验码附加在原数据帧后面,构建成一个新的数据帧进行发送;最后接收端在以模2除法方式除以前面选择的除数,如果没有余数,则说明数据帧在传输的过程中没有出错。
 

好,光说不练是假把式,来一个练练手。

假设咱要求出二进制序列10110011的CRC校验码。

选择的CRC生成多项式为G(X) = X4 + X3 + 1,

①将多项式转化为二进制序列,由G(X) = X4 + X3 + 1 可知序列为11001

②多项式的位数位5,则在数据帧的后面加上5-1位0,数据帧变为101100110000,然后使用模2除法除以除数11001,得到余数。

③将计算出来的CRC校验码添加在原始帧的后面,真正的数据帧为101100110100,再把这个数据帧发送到接收端。

④接收端收到数据帧后,用上面选定的除数,用模2除法除去,验证余数是否为0,如果为0,则说明数据帧没有出错。

上面介绍了CRC 的基本原理,那么我们要是变成的怎么变啊,还是一头雾水,不着急,下面就是超详细的步骤教你如何编程:

(1)、预置1个16位的寄存器为十六进制FFFF(即全为1),称此寄存器为CRC寄存器;
(2)、把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低
       8位相异或,把结果放于CRC寄存器,高八位数据不变;
(3)、把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;
(4)、如果移出位为0:重复第3步(再次右移一位);如果移出位为1,CRC寄存器与多

    项式A001(1010 0000 0000 0001)进行异或;
(5)、重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
(6)、重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;
(7)、将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低
       字节进行交换;
(8)、最后得到的CRC寄存器内容即为:CRC码。

以上计算步骤中的多项式A001是8005按位颠倒后的结果。

查表法是将移位异或的计算结果做成了一个表,就是将0~256放入一个长度为16位的寄存器中的低八位,高八位填充0,然后将该寄存器与多项式0XA001按照上述3、4步骤,直到八位全部移出,最后寄存器中的值就是表格中的数据,高八位、低八位分别单独一个表。

labview程序示例:

                                                                                 CRC16示例

                                                                               CRC8示例

上面的labview源程序想下载可以直接点击链接即可下载,例程简单,清晰明了,,点我下载例程

猜你喜欢

转载自blog.csdn.net/weixin_42164589/article/details/84996404
今日推荐