搜索
ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU

[应用相关] 如何通俗的理解CRC校验并用C语言实现

[复制链接]
281|60
 楼主 | 2020-4-9 10:54 | 显示全部楼层 |阅读模式
本篇文章通俗的讲解了何谓CRC?如何生成CRC码以及如何使用CRC码校验,最后采用多种思路用C语言实现CRC校验。
292495e8e8e44d9751.png

使用特权

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

使用特权

评论回复
 楼主 | 2020-4-9 10:55 | 显示全部楼层
那么,问题来了:

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

使用特权

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

使用特权

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

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

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

使用特权

评论回复
 楼主 | 2020-4-9 10:57 | 显示全部楼层
所以在模2除法中二进制运算结果如下:
     1 - 1 = 0
     1 - 0 = 1
     0 - 1 = 1
     0 - 0 = 1

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

使用特权

评论回复
 楼主 | 2020-4-9 10:58 | 显示全部楼层
”最后用一个例子演示一下“模2除法”:
93285e8e8f3bdb702.png

使用特权

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

使用特权

评论回复
 楼主 | 2020-4-9 10:59 | 显示全部楼层
标准的CRC生成多项式如下表:

646485e8e8fa283318.png

使用特权

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

使用特权

评论回复
 楼主 | 2020-4-9 11:02 | 显示全部楼层
计算过程如下:

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

使用特权

评论回复
 楼主 | 2020-4-9 11:03 | 显示全部楼层
2.根据生成多项式确定除数
除数就是生成多项式的二进制数,所以除数为:11001。

使用特权

评论回复
 楼主 | 2020-4-9 11:04 | 显示全部楼层
3.根据生成多项式确定被除数和CRC码的位数
CRC码的位数 = 生成多项式的二进制位数 - 1
根据之前转换的生成多项式的二进制位数,CRC码的位数为:5 - 1 = 4位。

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

使用特权

评论回复
 楼主 | 2020-4-9 11:05 | 显示全部楼层
4.使用模2除法计算CRC码
除数确定了,被除数也确定了,CRC码的位数也确定了,万事具备,只欠东风,接下来请出我们的“模2除法”,开始计算CRC码:
276135e8e90f2292eb.png

使用特权

评论回复
 楼主 | 2020-4-9 11:06 | 显示全部楼层
由图上的计算过程可知,得到的CRC码为: 0100。

使用特权

评论回复
 楼主 | 2020-4-9 11:06 | 显示全部楼层
(接收方)如何使用CRC码校验数据
接收方接收到原始数据10110011和CRC校验码0100后,校验数据是否正确的方法如下:

使用特权

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

使用特权

评论回复
 楼主 | 2020-4-9 11:07 | 显示全部楼层
2.根据接收到的数据和CRC码确定被除数
将接收到的数据和CRC码拼接起来,作为被除数,这里为:101100110100。

使用特权

评论回复
 楼主 | 2020-4-9 11:08 | 显示全部楼层
3.使用模2除法校验数据正确性
除数确定了,被除数也确定了,接下来再次使用“模2除法”校验:

595145e8e9191109ad.png

使用特权

评论回复
 楼主 | 2020-4-9 11:08 | 显示全部楼层
由图上的计算过程可知,校验得到的余数为0,接收结果:正确!

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

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表