如何计算CRC校验码(循环冗余检验码)

1、什么是CRC校验     

        在数据通信领域,CRC(循环冗余检验码)常用的一种查错校验码,它的信息字段和校验字段的长度可以任意选定。它主要是通过对要传输的数据进行多项式计算,然后将得到的结果附在数据帧的后面在进行传输,在收方收到数据帧后就可以利用CRC码对数据进行检查,那样就可以实现对数据的检错功能。他的实现原理如下:

        (N,K)码就是在K位的信息码后面加上R位的监督码元,整个码长度位N位,(N,K)码一个重要的特点就是整个编码的长度为N位,其中信息字段就是K位,所以校验字段(也叫作监督码元)的长度就是R=N-K位。

        对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。 校验码的具体生成过程为:假设要发送的信息用多项式C(X)表示,将C(x)左移R位(可表示成C(x)*2R),这样C(x)的右边就会空出R位,这就是校验码的位置。用 C(x)*2R 除以生成多项式G(x)得到的余数就是校验码。

2、如何求解CRC码


        任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。
下面是一个根据一个给定的生成多项式求CRC码的例子

假设使用的生成多项式是G(X)=X3+X+1。4位的原始报文为1010,求编码后的报文。
解:
1、将生成多项式G(X)=X3+X+1转换成对应的二进制除数1011。
2、此题生成多项式有4位(R+1)(注意:4位的生成多项式计算所得的校验码为3位,R为校验码位数),要把原始报文C(X)左移3(R)位变成1010 000
3、用生成多项式对应的二进制数对左移3位后的原始报文进行模2除(高位对齐),相当于按位异或 得到的余位011,所以最终编码为:1010 011



通过上面的例子我们大概的就了解了如何去计算一个信息字段的CRC校验码,可以把求CRC校验码的步骤总结如下:

1、将X的最高次幂为R的生成多项式G(X)转换成对应的R+1位二进制数。
2、将信息码左移R位,相当于对应的信息多项式C(X)*2R
3、用生成多项式(二进制数)对信息码做除,得到R位的余数(注意:这里的二进制做除法得到的余数其实是模2除法得到的余数,并不等于其对应十进制数做除法得到的余数。)。
4、将余数拼到信息码左移后空出的位置,得到完整的CRC码

3、深入理解CRC校验相关概念


生成多项式

是接受方和发送方的一个约定,也就是一个二进制数,在整个传输过程中,这个数始终保持不变。
在发送方,利用生成多项式对信息多项式做模2除生成校验码。在接收方利用生成多项式对收到的编码多项式做模2除检测和确定错误位置。
应满足以下条件:
A、生成多项式的最高位和最低位必须为1。
B、当被传送信息(CRC码)任何一位发生错误时,被生成多项式做除后应该使余数不为0。
C、不同位发生错误时,应该使余数不同。
D、对余数继续做除,应使余数循环。


原则

若设码字长度为N,信息字段为K位,校验字段为R位(N=K+R),则对于CRC码集中的任一码字,存在且仅存在一个R次多项式g(x),使得
V(x)=A(x)g(x)=xRm(x)+r(x);
其中: m(x)为K次原始的信息多项式, r(x)为R-1次校验多项式(即CRC校验和),
g(x)称为生成多项式:
g(x)=g0+g1x1+ g2x2+...+g(R-1)x(R-1)+gRxR
发送方通过指定的g(x)产生CRC码字,接收方则通过该g(x)来验证收到的CRC码字


  • 45
    点赞
  • 123
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: 单片机串口通信中,使用CRC校验可以对数据进行完整性检测。CRC(Cyclic Redundancy Check)是一种基于多项式运算的校验方法,通过在发送端计算并发送校验,在接收端再次计算校验并与接收到的校验进行比对,从而判断数据是否完好无损。 在单片机中进行串口CRC校验计算,可以按照以下步骤进行: 1. 初始化CRC寄存器,将CRC寄存器的值设置为初始值,通常为0xFFFF。 2. 从串口接收数据,将数据逐个字节送入CRC计算函数。 3. 根据CRC寄存器的当前值和接收到的数据字节,进行异或运算。 4. 对数据字节进行8次移位运算,每次判断最高位是否为1,如果是,则将CRC寄存器与预设的多项式进行异或运算。 5. 重复步骤4,直至数据字节的所有位都被处理完。 6. 当全部数据字节处理完毕后,CRC寄存器中的值即为计算得到的校验。 通过以上步骤,单片机可以计算得到串口数据的CRC校验,并在数据发送或接收时作为附加信息一起传输。在接收端,同样进行上述计算,然后将计算得到的校验与接收到的校验进行比对,若一致,则数据完好无损,否则需要进行错误处理。 通过使用CRC校验,可以在单片机串口通信中实现数据的可靠传输,确保数据的完整性和准确性。 ### 回答2: 单片机串口通信中,为了保证数据的可靠性,需要使用CRC校验进行数据校验。CRC校验是一种循环冗余校验,通过对数据进行异或运算,可以检测出数据传输过程中是否出现错误。 CRC校验计算方法如下: 1. 准备一个预置的生成多项式,通常为16位或32位的二进制数。 2. 将数据位从高位到低位逐个与生成多项式进行异或运算。 3. 将异或运算的结果作为新的数据位,继续进行异或运算,直到遍历完所有的数据位。 4. 将最终的异或运算结果作为CRC校验。 具体地,我们先将数据位的最高位与生成多项式的最高次幂系数进行异或运算,得到新的数据位,然后将新数据位与生成多项式的每一项进行异或运算,得到下一个新的数据位,依次循环,直至遍历完所有的数据位。最终得到的结果就是CRC校验。 在单片机中,可以使用循环移位寄存器来实现CRC校验计算循环移位寄存器是一种特殊的寄存器,可以实现数据的循环左移或右移操作。通过逐位异或运算,将数据位与生成多项式进行异或,然后将最高位的数据位插入到最低位,继续进行异或运算,最后得到的寄存器中的内容就是CRC校验。 在实际应用中,我们需要在发送端和接收端分别进行CRC校验计算,以确保数据的完整性。发送端在发送数据时,会先计算CRC校验,并将其添加到数据包中。接收端在接收数据时,会重新计算CRC校验,并与接收到的CRC校验进行比对,如果两者一致,则说明数据传输正确。 总的来说,单片机串口CRC校验计算是通过循环异或运算将数据位与生成多项式进行异或,最终得到的结果就是CRC校验。这种校验计算方法可以有效地保证数据传输的可靠性。 ### 回答3: 单片机串口通信过程,为了保证数据的正确传输,常常会采用CRC校验的方式进行数据校验。CRC校验是一种循环冗余检验码,用于检测数据传输中是否出现错误。 CRC校验计算过程如下: 1. 定义一个生成多项式,通常使用16位或32位的多项式。 2. 将待发送的数据与预设的校验生成多项式进行逐位异或操作。 3. 将得到的结果作为校验添加到待发送的数据中。 具体计算过程如下: 1. 初始化一个校验寄存器,初始值为全1。 2. 将数据按位异或到校验寄存器中。 3. 通过移位操作,对校验寄存器进行循环移位。 4. 若校验寄存器最高位为1,则进行异或运算,并将结果再次保留在校验寄存器中。 5. 重复3-4步骤,直到校验寄存器所有数据位都处理完毕。 6. 将最终的校验寄存器的值作为CRC校验。 在单片机中,可以使用循环结构来实现CRC校验计算。通过遍历待发送数据的每一位,并使用异或操作来更新校验寄存器的值,最后得到的校验寄存器的值即为CRC校验。 总之,单片机串口CRC校验计算是通过异或计算循环移位操作,将数据与预设的生成多项式进行校验,最后得到的校验寄存器的值作为CRC校验。这种校验方式可以有效地检测数据传输过程中的错误,保证数据的准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值