打印
[应用相关]

如何通俗的理解CRC校验并用C语言实现

[复制链接]
3152|78
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本篇**通俗的讲解了何谓CRC?如何生成CRC码以及如何使用CRC码校验,最后采用多种思路用C语言实现CRC校验。

使用特权

评论回复
沙发
functions|  楼主 | 2020-4-9 10:54 | 只看该作者
背景
最近在研究温湿度传感器SHT30,该传感器使用IIC接口进行通信,在读取数据时,该传感器分别在发送 16bit 的温度和湿度数据后,发送了 8bit 的CRC校验数据,如图所示:

使用特权

评论回复
板凳
functions|  楼主 | 2020-4-9 10:55 | 只看该作者
那么,问题来了:

     CRC是个什么东东?
     如何计算得到CRC码?
     如何使用CRC码校验?
     如何用C语言实现该CRC校验?

使用特权

评论回复
地板
functions|  楼主 | 2020-4-9 10:56 | 只看该作者
CRC到底是个什么东东
CRC学名叫做循环冗余校验,全称 cyclic redundancy check,这个词有两个含义:
      循环冗余校验功能:对要传送的数据进行多项式计算,并将所得结果跟着传送数据后发送,接收端再次进行校验;
      循环冗余校验码:对要传送的数据进行多项式计算后得到的值称为循环冗余校验码。
等等,好像跑题了,这个是官方解释,那么,我们该如何通俗的理解呢?接下里我带领大家在实战中领悟CRC的奥秘~

使用特权

评论回复
5
functions|  楼主 | 2020-4-9 10:56 | 只看该作者
计算CRC码之前的准备工作
关键点1 —— 模2除法
在CRC校验规则中,原始数据与给定的除数之间进行模2除法得到CRC码,发送端将原始数据和CRC码一起传送到接收端,接收端再

那么,模2除法的规则是怎样的呢?它和普通除法有什么不一样的呢?

模2除法与普通的算术除法类似,但是它有两个区别:
      不向上借位;
      不比较除数和被除数的相同位数值的大小,只要以相同位数进行相除即可;

使用特权

评论回复
6
functions|  楼主 | 2020-4-9 10:57 | 只看该作者
所以在模2除法中二进制运算结果如下:
     1 - 1 = 0
     1 - 0 = 1
     0 - 1 = 1
     0 - 0 = 1

乍一看,这个运算规则是不是似曾相识~这就是我们熟悉的异或运算,可以总结出“模2除法”的规则:
       模2除法不借位,相同位置用异或。

使用特权

评论回复
7
functions|  楼主 | 2020-4-9 10:58 | 只看该作者
”最后用一个例子演示一下“模2除法”:

使用特权

评论回复
8
functions|  楼主 | 2020-4-9 10:59 | 只看该作者
关键点2 —— 确定“生成多项式”
生成多项式既确定了如何改造原始数据作为被除数,也确定了除数,还确定了CRC码的位数,是整个CRC码生成过程的关键。

使用特权

评论回复
9
functions|  楼主 | 2020-4-9 10:59 | 只看该作者
标准的CRC生成多项式如下表:

使用特权

评论回复
10
functions|  楼主 | 2020-4-9 11:00 | 只看该作者
(发送方)如何计算CRC码
假设选择的CRC生成多项式为:
$$
G(X) = X^4 + X^3 + 1
$$
要求:请写出二进制序列10110011的CRC校验码。

使用特权

评论回复
11
functions|  楼主 | 2020-4-9 11:02 | 只看该作者
计算过程如下:

1.将生成多项式转换成二进制数
二进制数的总位数 = 最高位的幂次 + 1
多项式中只列出二进制值为1的位
根据这个规则可以得到,该生成多项式$G(X)$对应的二进制数总共有 5 位(4+1),其中第 4 位、第 3 位、第 0 位的二进制值为1,其它位均为0,所以该生成多项式的二进制为: 11001。

使用特权

评论回复
12
functions|  楼主 | 2020-4-9 11:03 | 只看该作者
2.根据生成多项式确定除数
除数就是生成多项式的二进制数,所以除数为:11001。

使用特权

评论回复
13
functions|  楼主 | 2020-4-9 11:04 | 只看该作者
3.根据生成多项式确定被除数和CRC码的位数
CRC码的位数 = 生成多项式的二进制位数 - 1
根据之前转换的生成多项式的二进制位数,CRC码的位数为:5 - 1 = 4位。

在原始数据后加上 CRC码的位数 个0,作为被除数,即:101100110000。

使用特权

评论回复
14
functions|  楼主 | 2020-4-9 11:05 | 只看该作者
4.使用模2除法计算CRC码
除数确定了,被除数也确定了,CRC码的位数也确定了,万事具备,只欠东风,接下来请出我们的“模2除法”,开始计算CRC码:

使用特权

评论回复
15
functions|  楼主 | 2020-4-9 11:06 | 只看该作者
由图上的计算过程可知,得到的CRC码为: 0100。

使用特权

评论回复
16
functions|  楼主 | 2020-4-9 11:06 | 只看该作者
(接收方)如何使用CRC码校验数据
接收方接收到原始数据10110011和CRC校验码0100后,校验数据是否正确的方法如下:

使用特权

评论回复
17
functions|  楼主 | 2020-4-9 11:07 | 只看该作者
1.获取发送方所使用的生成多项式
接收方首先要获取发送方所使用的生成多项式,然后使用该生成多项式的二进制数确定除数,即:11001。

使用特权

评论回复
18
functions|  楼主 | 2020-4-9 11:07 | 只看该作者
2.根据接收到的数据和CRC码确定被除数
将接收到的数据和CRC码拼接起来,作为被除数,这里为:101100110100。

使用特权

评论回复
19
functions|  楼主 | 2020-4-9 11:08 | 只看该作者
3.使用模2除法校验数据正确性
除数确定了,被除数也确定了,接下来再次使用“模2除法”校验:

使用特权

评论回复
20
functions|  楼主 | 2020-4-9 11:08 | 只看该作者
由图上的计算过程可知,校验得到的余数为0,接收结果:正确!

一旦接收数据和接收的CRC码中有一位改变,则计算结果余数不为0,校验失败。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

446

帖子

1

粉丝