CRC算法

CRC算法与实现bhw98摘要: 本文首先讨论了CRC的代数学算法,然后以常见的CRC-ITU为例,通过硬件电路的实现,引出了比特型算法,最后重点介绍了字节型快速查表算法,给出了相应的C 语言实现。

关键词: CRC, FCS, 生成多项式, 检错重传引言CRC的全称为Cyclic Redundancy Check,中文名称为循环冗余校验。

它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差错控制。

实际上,除数据通信外,CRC在其它很多领域也是大有用武之地的。

例如我们读软盘上的文件,以及解压一个ZIP文件时,偶尔会碰到“Bad CRC”错误,由此它在数据存储方面的应用可略见一斑。

差错控制理论是在代数理论基础上建立起来的。

这里我们着眼于介绍CRC的算法与实现,对原理只能捎带说明一下。

若需要进一步了解线性码、分组码、循环码、纠错编码等方面的原理,可以阅读有关资料。

利用CRC进行检错的过程可简单描述为:在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的r位监督码(CRC码),附在原始信息后边,构成一个新的二进制码序列数共k+r位,然后发送出去。

在接收端,根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。

这个规则,在差错控制理论中称为“生成多项式”。

1 代数学的一般性算法在代数编码理论中,将一个码组表示为一个多项式,码组中各码元当作多项式的系数。

例如1100101 表示为1·x6+1·x5+0·x4+0·x3+1·x2+0·x+1,即x6+x5+x2+1。

设编码前的原始信息多项式为P(x),P(x)的最高幂次加1等于k;生成多项式为G(x),G(x)的最高幂次等于r;CRC多项式为R(x);编码后的带CRC的信息多项式为T(x)。

发送方编码方法:将P(x)乘以xr(即对应的二进制码序列左移r位),再除以G(x),所得余式即为R(x)。

用公式表示为T(x)=x r P(x)+R(x)接收方解码方法:将T(x)除以G(x),如果余数为0,则说明传输中无错误发生,否则说明传输有误。

举例来说,设信息码为1100,生成多项式为1011,即P(x)=x3+x2,G(x)=x3+x+1,计算CRC的过程为x r P(x) x3(x3+x2) x6+x5 x-------- = ---------- = -------- = (x3+x2+x) + --------G(x) x3+x+1 x3+x+1 x3+x+1即R(x)=x。

注意到G(x)最高幂次r=3,得出CRC为010。

如果用竖式除法,计算过程为1110-------1011 /1100000 (1100左移3位)1011----11101011-----10101011-----00100000----010因此,T(x)=(x6+x5)+(x)=x6+x5+x, 即1100000+010=1100010如果传输无误,T(x) x6+x5+x------ = --------- = x3+x2+x,G(x) x3+x+1无余式。

回头看一下上面的竖式除法,如果被除数是1100010,显然在商第三个1时,就能除尽。

上述推算过程,有助于我们理解CRC的概念。

但直接编程来实现上面的算法,不仅繁琐,效率也不高。

实际上在工程中不会直接这样去计算和验证CRC。

下表中列出了一些见于标准的CRC资料:* 统一去掉了,如04C11DB7实际上是104C11DB7。

** 前称CRC-CCITT。

ITU的前身是CCITT。

2 硬件电路的实现方法多项式除法,可用除法电路来实现。

除法电路的主体由一组移位寄存器和模2加法器(异或单元)组成。

以CRC-ITU为例,它由16级移位寄存器和3个加法器组成,见下图(编码/解码共用)。

编码、解码前将各寄存器初始化为"1",信息位随着时钟移入。

当信息位全部输入后,从寄存器组输出CRC结果。

3 比特型算法上面的CRC-ITU除法电路,完全可以用软件来模拟。

定义一个寄存器组,初始化为全"1"。

依照电路图,每输入一个信息位,相当于一个时钟脉冲到来,从高到低依次移位。

移位前信息位与bit0相加产生临时位,其中bit15移入临时位,bit10、bit3还要加上临时位。

当全部信息位输入完成后,从寄存器组取出它们的值,这就是CRC码。

typedef unsigned char bit;typedef unsigned char byte;typedef unsigned short u16;typedef union {u16 val;struct {u16 bit0 : 1;u16 bit1 : 1;u16 bit2 : 1;u16 bit3 : 1;u16 bit4 : 1;u16 bit5 : 1;u16 bit6 : 1;u16 bit7 : 1;u16 bit8 : 1;u16 bit9 : 1;u16 bit10 : 1;u16 bit11 : 1;u16 bit12 : 1;u16 bit13 : 1;u16 bit14 : 1;u16 bit15 : 1;} bits;} CRCREGS;// 寄存器组CRCREGS regs;// 初始化CRC寄存器组:移位寄存器置为全"1" void crcInitRegisters(){regs.val = 0xffff;}// CRC输入一个bitvoid crcInputBit(bit in){bit a;a = regs.bits.bit0 ^ in;regs.bits.bit0 = regs.bits.bit1;regs.bits.bit1 = regs.bits.bit2;regs.bits.bit2 = regs.bits.bit3;regs.bits.bit3 = regs.bits.bit4 ^ a;regs.bits.bit4 = regs.bits.bit5;regs.bits.bit5 = regs.bits.bit6;regs.bits.bit6 = regs.bits.bit7;regs.bits.bit7 = regs.bits.bit8;regs.bits.bit8 = regs.bits.bit9;regs.bits.bit9 = regs.bits.bit10;regs.bits.bit10 = regs.bits.bit11 ^ a;regs.bits.bit11 = regs.bits.bit12;regs.bits.bit12 = regs.bits.bit13;regs.bits.bit13 = regs.bits.bit14;regs.bits.bit14 = regs.bits.bit15;regs.bits.bit15 = a;}// 输出CRC码(寄存器组的值)u16 crcGetRegisters(){return regs.val;}crcInputBit中一步一步的移位/异或操作,可以进行简化:void crcInputBit(bit in){bit a;a = regs.bits.bit0 ^ in;regs.val >>= 1;if(a) regs.val ^= 0x8408;}细心的话,可以发现0x8408和0x1021(CRC-ITU的简记式)之间的关系。

由于我们是从低到高输出比特流的,将0x1021左右反转就得到0x8408。

将生成多项式写成G(x)=1+x5+x12+x16,是不是更好看一点?下面是一个典型的PPP帧。

最后两个字节称为FCS(Frame Check Sequence),是前面11个字节的CRC。

FF 03 C0 21 04 03 00 07 0D 03 06 D0 3A我们来计算这个PPP帧的CRC,并验证它。

byte ppp[13] = {0xFF, 0x03, 0xC0, 0x21, 0x04, 0x03, 0x00, 0x07, 0x0D, 0x03, 0x06, 0x00, 0x00};int i,j;u16 result;/////////// 以下计算FCS// 初始化crcInitRegisters();// 逐位输入,每个字节低位在先,不包括两个FCS字节for(i = 0; i < 11; i++){for(j = 0; j < 8; j++){crcInputBit((ppp[i] >> j) & 1);}}// 得到CRC:将寄存器组的值求反result = ~crcGetRegisters();// 填写FCS,先低后高ppp[11] = result & 0xff;ppp[12] = (result >> 8) & 0xff;/////////// 以下验证FCS// 初始化crcInitRegisters();// 逐位输入,每个字节低位在先,包括两个FCS字节for(i = 0; i < 13; i++){for(j = 0; j < 8; j++){crcInputBit((ppp[i] >> j) & 1);}}// 得到验证结果result = crcGetRegisters();可以看到,计算出的CRC等于0x3AD0,与原来的FCS相同。

验证结果等于0。

初始化为全"1",以及将寄存器组的值求反得到CRC,都是CRC-ITU的要求。

事实上,不管初始化为全"1"还是全"0",计算CRC取反还是不取反,得到的验证结果都是0。

4 字节型算法比特型算法逐位进行运算,效率比较低,不适用于高速通信的场合。

数字通信系统(各种通信标准)一般是对一帧数据进行CRC校验,而字节是帧的基本单位。

最常用的是一种按字节查表的快速算法。

该算法基于这样一个事实:计算本字节后的CRC码,等于上一字节余式CRC码的低8位左移8位,加上上一字节CRC右移8位和本字节之和后所求得的CRC码。

如果我们把8位二进制序列数的CRC(共256个)全部计算出来,放在一个表里,编码时只要从表中查找对应的值进行处理即可。

CRC-ITU的计算算法如下:a.寄存器组初始化为全"1"(0xFFFF)。

b.寄存器组向右移动一个字节。

c.刚移出的那个字节与数据字节进行异或运算,得出一个指向值表的索引。

d.索引所指的表值与寄存器组做异或运算。

合集下载

CRC校验算法学习

CRC校验算法学习

CRC校验算法学习CRC(Cyclic Redundancy Check)校验算法是一种常用的数据传输错误检测算法,通过采用二进制多项式除法进行计算,能够高效地检测出传输过程中出现的错误。

1.需要进行校验的数据被看作是一个二进制数,以位序从高到低排列。

2.被检测的数据被除以一个预先选定的标准除数(也称为生成多项式),生成的余数被附加到原始数据后面,形成一个新的数据。

3.发送方将新的数据传输给接收方。

4.接收方接到数据后,进行同样的除法运算,如果所得的余数为0,说明传输过程中没有出现错误;如果余数不为0,说明传输过程中出现了错误。

1.算法简单,实现方便。

2.高效地检测出错误,能够探测到大多数单比特错、双比特错和比特异或错。

1.确定生成多项式G,以二进制形式表示。

生成多项式的最高次幂为n,其最低项系数为1,其他项的系数可以为0或1、G的位数为n+12.将待发送的数据D转换为二进制形式,并在其最高位前面补n个0,得到扩展后的数据M。

3.计算M除以G的余数,即CRC值,记为R。

4.在待发送的数据D的末尾添加余数R,得到带有CRC校验码的数据T,将T发送给接收方。

5.接收方接收到数据T后,将数据与G进行除法运算,计算得到余数R'。

6.如果R'等于0,则说明数据传输没有发生错误;如果R'不等于0,则说明发生了错误。

除了基本的CRC校验算法,还存在许多衍生的CRC算法,如CRC-8、CRC-16和CRC-32等。

这些算法在生成多项式和数据处理方式上有所不同,适用于不同的应用场景。

总结来说,CRC校验算法是一种用于数据传输错误检测的算法,通过二进制多项式除法进行计算,能够高效地检测出传输过程中出现的错误。

它具有算法简单、高效检测错误等优势,并且在各种领域有广泛应用。

crc循环冗余码计算

crc循环冗余码计算

crc循环冗余码计算CRC(循环冗余码)是一种常用于错误检测的编码技术。

它通过对数据进行计算,并附加一个校验码,以便在数据传输过程中检测出错误。

本文将介绍CRC的原理、计算方法以及应用领域。

一、CRC的原理CRC是一种循环冗余校验码,它的原理是通过对数据进行除法运算来生成校验码。

具体步骤如下:1. 首先,选择一个生成多项式G(通常用二进制表示),并确定校验码的位数(通常和G的次数相同)。

2. 将数据进行左移,使其比G的次数多一位,然后用G来除这个左移后的数据,得到余数。

3. 将这个余数附加到原始数据的末尾,得到带有校验码的数据。

二、CRC的计算方法CRC的计算方法比较简单,可以通过以下步骤进行:1. 将数据转换为二进制形式。

2. 在数据末尾添加若干个0,位数等于校验码的位数。

3. 用生成多项式G来除这个新的数据,得到余数。

4. 将这个余数附加到原始数据的末尾,得到带有校验码的数据。

三、CRC的应用领域CRC广泛应用于数据通信和存储领域,常见的应用包括:1. 网络通信:在网络通信中,CRC被用于验证数据包的完整性,以确保数据的准确传输。

2. 存储介质:在硬盘、闪存等存储介质中,CRC被用于检测和纠正数据的错误。

3. 无线电通信:在无线电通信中,CRC可用于验证无线电信号的完整性,以提高通信质量。

4. 数据校验:在数据传输过程中,CRC可以用于检测是否出现了错误或数据损坏。

四、CRC的优势和不足CRC具有以下优势:1. 算法简单:CRC的计算方法相对简单,可以快速计算校验码。

2. 高效性:CRC能够检测多种错误类型,包括单比特错误、多比特错误以及奇偶位错误。

3. 可靠性:CRC的位数越多,检测错误的能力越强,提高了数据传输的可靠性。

然而,CRC也存在一些不足之处:1. 无法纠正错误:CRC只能检测错误,无法纠正数据中的错误。

2. 传输效率:CRC需要在数据传输过程中附加校验码,从而增加了传输的开销。

CRC校验算法详解及代码实现

CRC校验算法详解及代码实现

CRC校验算法详解及代码实现CRC校验算法的原理是利用生成多项式来计算数据的校验值。

在发送端,将数据和生成多项式进行计算得到一个校验值,然后将这个校验值附加到发送的数据后面一起传输。

在接收端,接收到数据后再次进行计算,并与接收到的校验值进行比较,如果相同则说明数据传输过程中没有错误,否则说明数据传输过程中出现错误。

下面是CRC校验算法的具体步骤:1.选择一个生成多项式,通常用一个二进制数表示。

生成多项式的位数称为CRC位数,常见的有CRC-8,CRC-16,CRC-32等。

2.将生成多项式的最高位与数据的最高位对齐,然后进行异或运算。

异或运算的结果作为下一次异或运算的输入,直到将所有数据都计算完毕。

3.将计算得到的结果作为校验值附加到数据后面一起传输。

下面是一个简单的CRC校验算法的代码实现:```pythondef crc(data, generator):crc_value = 0generator_length = len(generator)for bit in data:crc_value ^= bitif crc_value & 0x1:crc_value = (crc_value >> 1) ^ int(generator, 2)else:crc_value = crc_value >> 1return crc_value#测试数据data = [1, 0, 1, 1]generator = "1011"#进行CRC校验residue = crc(data, generator)print(residue)```在上面的代码中,`data`表示要进行校验的数据,以列表的形式表示,每个元素是一个二进制位。

`generator`表示生成多项式,以字符串的形式表示,每个字符是一个二进制位。

程序输出的结果为校验值。

总结:本文详细介绍了CRC校验算法的原理和步骤,并给出了一个简单的代码实现。

crc异或校验算法

crc异或校验算法

crc异或校验算法CRC异或校验算法CRC(Cyclic Redundancy Check)异或校验算法是一种常用的数据校验算法,通过对数据进行异或运算来检测数据传输过程中是否出现错误。

本文将介绍CRC异或校验算法的原理、实现步骤以及一些应用场景。

一、原理CRC异或校验算法的原理基于二进制数的异或运算。

在数据传输过程中,发送方通过对数据进行异或运算,生成校验码,然后将数据和校验码一起发送给接收方。

接收方收到数据后,同样对数据进行异或运算,得到一个校验码。

如果接收到的校验码与计算得到的校验码一致,说明数据传输过程中没有出现错误。

反之,如果校验码不一致,就意味着数据出现错误。

二、实现步骤CRC异或校验算法的实现步骤如下:1.选择一个生成多项式,通常采用标准的CRC-16、CRC-32等多项式。

2.将生成多项式转换为二进制数,并且在最高位补1。

3.将要发送的数据转换为二进制数。

4.将数据的最高位与生成多项式的最高位对齐,然后进行异或运算。

5.将异或运算结果后移一位,并将下一位数据与生成多项式最高位进行异或运算。

6.重复上述步骤,直到所有数据都进行过异或运算。

7.最后得到的结果就是校验码,将校验码附加到数据后发送给接收方。

三、应用场景CRC异或校验算法广泛应用于数据通信领域,特别是在串口通信、以太网通信和无线通信中。

由于其简单高效的特点,CRC异或校验算法被广泛接受并应用于各种通信协议中。

以下是一些常见的应用场景:1.串口通信:在串口通信中,为了保证数据的可靠传输,常常使用CRC异或校验算法对数据进行校验。

接收方在接收到数据后,通过对数据进行异或运算,判断数据是否正确。

2.以太网通信:在以太网通信中,CRC异或校验算法用于检测数据帧是否出现错误。

接收方通过对数据帧进行异或运算,判断数据是否正确,如果校验码不一致,则丢弃该数据帧。

3.无线通信:在无线通信中,由于受到信道干扰等因素的影响,数据很容易出现错误。

CRC校验码计算详解

CRC校验码计算详解

CRC校验码计算详解CRC(Cyclic Redundancy Check)是一种常用的错误检测码,被广泛应用于通信、数据存储等领域。

它通过在数据传输过程中添加一些冗余的校验位,在接收端对接收到的数据进行校验,判断数据是否发生了错误或者变化。

在CRC校验码计算中,最关键的是选择合适的生成多项式。

生成多项式生成多项式是CRC中很重要的一个参数,决定了校验码的长度和性能。

常见的生成多项式有CRC-16、CRC-32等,其中CRC-32具有较高的错误检测能力。

生成多项式可以通过数学计算的方式进行选择,常见的生成多项式如下:-CRC-8:x^8+x^2+x+1-CRC-16:x^16+x^15+x^2+1-CRC-32:x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1计算CRC校验码的步骤1.选择生成多项式。

根据需要选择合适的生成多项式,如CRC-322.初始化寄存器。

将寄存器设置为全0。

3.将要传输的数据添加到帧尾部。

在原始数据的末尾添加一个确定长度的校验位,通常为生成多项式的位数-14.逐位计算校验码。

从最高位开始,对每一位数据进行处理。

-如果当前位为1,则将寄存器的最高位与生成多项式进行异或操作。

-将寄存器向右移动一位,丢弃最低位。

5.重复第4步,直到所有数据都被处理完。

6.返回校验码。

将寄存器的内容作为校验码。

验证CRC校验码的步骤在接收端,可以使用相同的生成多项式和计算过程对接收到的数据进行校验,判断其是否发生了错误或者变化。

1.初始化寄存器。

将寄存器设置为全0。

2.将接收到的数据添加到寄存器。

3.逐位计算校验码。

从最高位开始,对每一位数据进行处理。

处理过程与计算CRC校验码的步骤相同。

4.判断校验码。

如果最终寄存器的值与接收到的校验码一致,则数据未发生错误或者变化,否则说明数据发生错误或者变化。

1.算法简单。

CRC校验码的计算过程非常简单,可以很容易地实现。

CRC算法原理及C语言实现

CRC算法原理及C语言实现

CRC算法原理及C语言实现CRC(Cyclic Redundancy Check)循环冗余校验算法是一种常用的错误检测算法,广泛应用于数据通信、存储等领域。

它通过对发送的数据进行多项式计算,得到一个校验值,然后将这个校验值附加到数据末尾,接收方再进行校验,通过比较接收到的校验值和重新计算的校验值来判断数据是否出现错误。

本文将介绍CRC算法的原理以及如何使用C语言实现。

一、CRC算法原理1.多项式表示CRC算法使用一个多项式来进行计算,这个多项式称为校验多项式(Generator Polynomial)。

在CRC算法中,校验多项式是一个二进制数,其中最高位为1,低位为0。

例如,CRC-32算法的校验多项式是0x04C11DB72.计算过程(1)初始化:将校验值设为一个固定的初始值,通常为全为0的二进制数。

(2)数据处理:逐位处理输入的数据,包括附加校验值的数据。

(3)除法运算:对每一位数据按位异或,然后进行除法运算,取余数。

(4)更新校验值:将余数与下一位数据进行异或运算,再将结果作为新的校验值。

(5)重复上述步骤,直到处理完所有的数据。

3.校验结果CRC算法的校验结果即为最后得到的校验值。

在进行校验时,接收方使用相同的校验多项式,对接收到的数据进行相同的操作,得到的校验值与发送方发送的校验值进行比较,如果相同,则说明数据未发生错误,否则则说明数据出现了错误。

二、C语言实现CRC算法下面是一个简单的C语言实现CRC算法的例子,以CRC-32算法为例:```c#include <stdio.h>//初始化校验值unsigned int crc32_inireturn 0xFFFFFFFF;//计算CRC值unsigned int i, j;for (i = 0; i < length; i++)crc = crc ^ data[i];for (j = 0; j < 8; j++)if ((crc & 1) != 0)crc = (crc >> 1) ^ CRC32_POLYNOMIAL;} elsecrc = crc >> 1;}}}return crc;int maiunsigned char data[] = "Hello, World!";unsigned int crc = crc32_init(;printf("CRC-32 value: %08X\n", crc ^ 0xFFFFFFFF);return 0;```以上就是CRC算法的原理及使用C语言实现的内容。

CRC_计算方法

略了,有些迷惑哦。要是生成多项式要是都省了,那还怎么校验?我猜想可能是中间的全为
一吧。
生成多项式的最高位固定的1,故在简记式中忽略最高位1了,如0x1021实际是0x11021。 I、基本算法(人工笔算):
以 CRC16-CCITT 为例进行说明,CRC 校验码为16位,生成多项式17位。假如数据流为4 字节:BYTE[3]、BYTE[2]、BYTE[1]、BYTE[0]; 数据流左移16位,相当于扩大256×256倍,再除以生成多项式0x11021,做不借位的除法运算
3、CRC 校验码软件生成方法:
借助于多项式除法,其余数为校验字段。
例如:信息字段代码为: 1011001;对应 m(x)=x6+x4+x3+1
假设生成多项式为:g(x)=x4+x3+1;则对应 g(x)的代码为: 11001
x4m(x)=x10+x8+x7+x4 对应的代码记为:10110010000;
3、CRC 码集选择的原则:若设码字长度为 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次校验多项式,
否则仅将寄存器左移1位(寄存器的最低位从下一个字节获得); 3)重复第2步,直到数据流(6字节)全部移入寄存器; 4)寄存器中的值则为 CRC 校验码 CRC[1]、CRC[0]。
III、计算机算法2(字节型算法):256^n 表示256的 n 次方 把按字节排列的数据流表示成数学多项式,设数据流为 BYTE[n]BYTE[n-1]BYTE[n-

crc校验算法

crc校验算法crc校验的描述:1.CRC校验原理CRC校验的原理的难易暂不评价,毕竟会者不难,难者不会么。

CRC校验的根本思想是在要发送的帧之后附加⼀个数(CRC校验值),⽣成⼀个新帧,然后发送给接收端。

当然,这个附加的数并不是随意的,他要使新⽣成的帧能在发送端和接收端选定的某个特定的数整除。

当然,这个特定的数和整除的⽅法也不是随意的,特定的数是经过多次论证选定的⼀些列数,这在之后会述说,整除的⽅法是模2除法。

模2除法(crc原理最核⼼的思想)模2除法与算术除法类似,都是除法,不同的是,除的时候既不向上借位,也不⽐较除数和被除数的⼤⼩,只要以相同的位数进⾏相除即可。

模2加法:1+1=0,0+1=1, 0+0=0,⽆进位也⽆借位;模2减法:1-1=0, 0-1=1,0-0=0,也⽆进位,⽆借位,相当于⼆进制中的异或运算。

即⽐较后,相同为0,相异为1。

如100101除以1110,结果的商为11,余数为1.关于模2除法中除数的选择,这个你可以⾃⼰随意选择,开玩笑的,随意选择的除数,会导致帧校验的正确率下降,这是不确定的,要看你选择的除数。

⽽我们⼀般的除数的选择是直接去参照⼀些专家讲过多次试验下来的⼀些除数,这些除法能极⼤的保证帧校验的正确率。

⼀般⽽⾔crc8校验的错误率为1/256,crc16校验的错误率为1/65536,crc32校验的错误率为1/(65536*65536).那这⾥就有⼀个问题,我们传送的是⼀串字节数据,⽽不是⼀个数据,怎么将⼀串数字变成⼀个数据呢?这也很简单,⽐如说2个字节B1,B2,那么对应的数就是(B1<<8)+B2;如果是3个字节B1,B2,B3,那么对应的数就是((B1<<16)+(B2<<8)+B3),⽐如数字是0x01,0x02,0x03,那么对应的数字就是0x10203;依次类推。

如果字节数很多,那么对应的数就⾮常⾮常⼤,不过幸好CRC只需要得到余数,⽽不需要得到商。

CRC算法

一、循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC。

它是利用除法及余数的原理来作错误侦测(Error Detecting)的。

实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CRC值不同,则说明数据通讯出现错误。

根据应用环境与习惯的不同,CRC又可分为以下几种标准:①CRC-12码;②CRC-16码;③CRC-CCITT码;④CRC-32码。

CRC-12码通常用来传送6-bit字符串。

CRC-16及CRC-CCITT码则用是来传送8-bit字符,其中CRC-16为美国采用,而CRC-CCITT为欧洲国家所采用。

CRC-32码大都被采用在一种称为Point-to-Point的同步传输中。

下面以最常用的CRC-16为例来说明其生成过程。

CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或(异或:二进制运算相同为0,不同为1;0^0=0;0^1=1;1^0=1;1^1=0),之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移出CRC寄存器)如果为1,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,则无需进行异或。

重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位。

所有的字符处理完成后CRC寄存器内的值即为最终的CRC值。

下面为CRC的计算过程:1.设置CRC寄存器,并给其赋值FFFF(hex)。

2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC 寄存器。

3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。

4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。

CRC怎么计算

很多人都在进行modbus通讯时,不知道如何计算CRC校验位,现在把算法分享给大家,希望能够有帮助。

在CRC计算时只用8个数据位,起始位及停止位,如有奇偶校验位也包括奇偶校验位,都不参与CRC计算。

CRC计算方法是:
1、加载一值为0XFFFF的16位寄存器,此寄存器为CRC寄存器。

2、把第一个8位二进制数据(即通讯信息帧的第一个字节)与16位的CRC寄存器的相异或,异或的结果仍存放于该CRC寄存器中。

3、把CRC寄存器的内容右移一位,用0填补最高位,并检测移出位是0还是1。

4、如果移出位为零,则重复第三步(再次右移一位);如果移出位为1,CRC寄存器与0XA001进行异或。

5、重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理。

6、重复步骤2和5,进行通讯信息帧下一个字节的处理。

7、将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC 寄存器的高、低字节进行交换
8、最后得到的CRC寄存器内容即为:CRC校验码。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档