一个完整无误的汇编CRC

一个完整无误的汇编CRC
一个完整无误的汇编CRC

一个完整无误的CRC-16循环冗余校验MCS-51汇编源代码

TEMP EQU 40H

CHKSUMBYL EQU 46H ;校验和低字节

CHKSUMBYH EQU 47H ;校验和高字节

DATALENGTH EQU 4FH ;待校验的数据串长度

ORG 0000H

MOV TEMP,#1EH

MOV TEMP+1,#6

MOV TEMP+2,#20H

MOV TEMP+3,#0

MOV TEMP+4,#0

MOV TEMP+5,#2

LCALL MAKE_CHKSUM

SJMP $

;-----------------------------------------------------------------------------

;运行: 1E 06 20 00 00 02 01 A4 ,16进制,设备地址,命令,存储器地址高,存储器地址低,参数高,参数低,校验高,校验低。;停止: 1E 06 20 00 00 01 41 A5 , 9600,8,N,2

;送参数:1E 06 20 01 0B B8 D6 E7

;-----------------------------------------------------------------------------

MAKE_CHKSUM: ;RTU 模式,CRC - 16 校验,用软件模拟仿真检查无误,在台达变频器上通过

MOV R0,#TEMP

MOV CHKSUMBYL,#0FFH ;1.预置 16 位寄存器为十六进制 FFFF(即全为 1),低字节

MOV CHKSUMBYH,#0FFH ; 预置 16 位寄存器为十六进制 FFFF(即全为 1),高字节

MOV DATALENGTH,#6 ;待校验的数据串长度

CHKSUM_LP1:

MOV A,@R0 ;2.把第一个 8 位数据与 16 位 CRC 寄存器的低位相异或,

XRL A,CHKSUMBYL

MOV CHKSUMBYL,A ;并把结果放于CRC 寄存器

MOV R7,#8

CHKSUM_LP2:

MOV A,CHKSUMBYH

CLR C

RRC A ;3.把寄存器的内容右移一位(朝低位),先移动高字节

MOV CHKSUMBYH,A

MOV A,CHKSUMBYL

RRC A ;再移动低字节

MOV CHKSUMBYL,A

JNC CHKSUM_JP ;4.检查最低位(移出位),如果最低位为 0 ,重复第 3 步(再次移位)

MOV A,CHKSUMBYL

XRL A,#01H ;如果最低位为 1,CRC 寄存器与多项式 A001 进行异或

MOV CHKSUMBYL,A

MOV A,CHKSUMBYH

XRL A,#0A0H

MOV CHKSUMBYH,A

CHKSUM_JP:

DJNZ R7,CHKSUM_LP2 ;5.重复步骤 3 和 4,直到右移 8 次,这样整个 8 位数据全部进行了处理 INC R0

DJNZ DATALENGTH,CHKSUM_LP1 ;6.重复步骤2 到步骤 5,进行下一个 8 位数据的处理

RET

END

crc校验码详细介绍看懂了就会了

循环冗余校验码( CRC)的基本原理是:在K 位信息码后再拼接R位的校验码,整个编码长度为N 位,因此,这种编码又叫( N,K)码。对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x) 。根据G(x) 可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。校验码的具体生成过程为:假设发送信息用信息多项式C(X)表示,将C(x) 左移R位,则可表示成C(x)*2 的R次方,这样C(x) 的右边就会空出R位,这就是校验码的位置。通过C(x)*2 的R次方除以生成多项式G(x) 得到的余数就是校验码。编辑本段几个基本概念 1、多项式与二进制数码 多项式和二进制数有直接对应关系:x 的最高幂次对应二进制数的最高位,以下各位对应多项式的各幂次,有此幂次项对应1,无此幂次项对应0。可以看出:x 的最高幂次为R,转换成对应的二进制数有R+1位。 多项式包括生成多项式G(x)和信息多项式C(x) 。如生成多项式为 G(x)=x^4+x^3+x+1 ,可转换为二进制数码11011。而发送信息位1111 ,可转换为数据多项式为C(x)=x^3+x^2+x+1 。 2、生成多项式是接受方和发送方的一个约定,也就是一个二进制数,在整个传输过程中,这个数始终保持不变。 在发送方,利用生成多项式对信息多项式做模2 除生成校验码。在接受方利用生成多项式对收到的编码多项式做模2 除检测和确定错误位置。 应满足以下条件: a、生成多项式的最高位和最低位必须为1。 b、当被传送信息( CRC码)任何一位发生错误时,被生成多项式做除后应该使余数不为0。 c、不同位发生错误时,应该使余数不同。 d、对余数继续做除,应使余数循环。 3 CRC码的生成步骤 1、将x 的最高次幂为R的生成多项式G(x) 转换成对应的R+1位二进制数。 2、将信息码左移R位,相当与对应的信息多项式C(x)*2 的R次方。 3、用生成多项式(二进制数)对信息码做除,得到R 位的余数。 4、将余数拼到信息码左移后空出的位置,得到完整的CRC码。 例】假设使用的生成多项式是G(x)=x^3+x+1 。4 位的原始报文为1010, 求编码后的报文。 解:

crc校验码 详细介绍看懂了就会了

循环冗余校验码(CRC)的基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码又叫(N,K)码。对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。校验码的具体生成过程为:假设发送信息用信息多项式C(X)表示,将C(x)左移R位,则可表示成C(x)*2的R次方,这样C(x)的右边就会空出R位,这就是校验码的位置。通过C(x)*2的R次方除以生成多项式G(x)得到的余数就是校验码。 编辑本段 几个基本概念 1、多项式与二进制数码 多项式和二进制数有直接对应关系:x的最高幂次对应二进制数的最高位,以下各位对应多项式的各幂次,有此幂次项对应1,无此幂次项对应0。可以看出:x的最高幂次为R,转换成对应的二进制数有R+1位。 多项式包括生成多项式G(x)和信息多项式C(x)。 如生成多项式为G(x)=x^4+x^3+x+1,可转换为二进制数码11011。 而发送信息位1111,可转换为数据多项式为C(x)=x^3+x^2+x+1。 2、生成多项式 是接受方和发送方的一个约定,也就是一个二进制数,在整个传输过程中,这个数始终保持不变。 在发送方,利用生成多项式对信息多项式做模2除生成校验码。在接受方利用生成多项式对收到的编码多项式做模2除检测和确定错误位置。 应满足以下条件: a、生成多项式的最高位和最低位必须为1。 b、当被传送信息(CRC码)任何一位发生错误时,被生成多项式做除后应该使余数不为0。 c、不同位发生错误时,应该使余数不同。 d、对余数继续做除,应使余数循环。 3 CRC码的生成步骤 1、将x的最高次幂为R的生成多项式G(x)转换成对应的R+1位二进制数。 2、将信息码左移R位,相当与对应的信息多项式C(x)*2的R次方。 3、用生成多项式(二进制数)对信息码做除,得到R位的余数。 4、将余数拼到信息码左移后空出的位置,得到完整的CRC码。 【例】假设使用的生成多项式是G(x)=x^3+x+1。4位的原始报文为1010,求编码后的报文。 解: 1、将生成多项式G(x)=x^3+x+1转换成对应的二进制除数1011。 2、此题生成多项式有4位(R+1),要把原始报文C(x)左移3(R)位变成1010000 3、用生成多项式对应的二进制数对左移3位后的原始报文进行模2除,相当于按位异或: 1010000

CRC32 冗余校验码的计算

题目: 校验码的计算 姓名: 周小多 学号:2013302513 班号:10011302 时间:2015.11.1

计算机学院 时间: 目录 摘要 1 目的 (1) 2 要求 (1) 3 相关知识 (1) 4 实现原理及流程图.......................... 错误!未定义书签。 5 程序代码 (7) 6 运行结果与分析 (7) 7 参考文献 (8)

题目:

的多项式G(x)。根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。校验码的具体生成过程为:假设要发送的信息用多项式C(X)表示,将C(x)左移R位(可表示成C(x)*2R),这样C(x)的右边就会空出R位,这就是校验码的位置。用 C(x)*2R除以生成多项式G(x)得到的余数就是校验码。 任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。 4、实现原理及流程图 CRC校验码的编码方法是用待发送的二进制数据t(x)除以生成多项式g(x),将最后的余数作为CRC校验码。其实现步骤如下: (1)设待发送的数据块是m位的二进制多项式t(x),生成多项式为r阶的g(x)。在数据块的末尾添加r个0,数据块的长度增加到m+r位。 (2)用生成多项式g(x)去除,求得余数为阶数为r-1的二进制多项式y(x)。此二进制多项式y(x)就是t(x)经过生成多项式g(x)编码的CRC校验码。 (3)用以模2的方式减去y(x),得到二进制多项式。就是包含了CRC校验码的待发送字符串。

CRC校验原理及步骤

C R C校验原理及步骤 This model paper was revised by the Standardization Office on December 10, 2020

CRC校验原理及步骤 什么是CRC校验 CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。 CRC校验原理: 其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“模2除法”)。到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。如果有余数,则表明该帧在传输过程中出现了差错。 模2除法: 模2除法与算术除法类似,但每一位除的结果不影响其它位,即不向上一位借位,所以实际上就是异或。在循环冗余校验码(CRC)的计算中有应用到模2除法。 例: CRC校验步骤:

CRC校验中有两个关键点,一是预先确定一个发送送端和接收端都用来作为除数的二进制比特串(或多项式),可以随机选择,也可以使用国际标准,但是最高位和最低位必须为1;二是把原始帧与上面计算出的除数进行模2除法运算,计算出CRC码。 具体步骤: 1. 选择合适的除数 2. 看选定除数的二进制位数,然后再要发送的数据帧上面加上这个位数-1位的0,然后用新生成的帧以模2除法的方式除上面的除数,得到的余数就是该帧的CRC校验码。注意,余数的位数一定只比除数位数少一位,也就是CRC校验码位数比除数位数少一位,如果前面位是0也不能省略。 3. 将计算出来的CRC校验码附加在原数据帧后面,构建成一个新的数据帧进行发送;最后接收端在以模2除法方式除以前面选择的除数,如果没有余数,则说明数据帧在传输的过程中没有出错。 CRC校验码计算示例: 现假设选择的CRC生成多项式为G(X)= X4+ X3+ 1,要求出二进制序列的CRC校验码。下面是具体的计算过程: ①将多项式转化为二进制序列,由G(X)= X4+ X3+ 1可知二进制一种有五位,第4位、第三位和第零位分别为1,则序列为11001 ②多项式的位数位5,则在数据帧的后面加上5-1位0,数据帧变为,然后使用模2除法除以除数11001,得到余数。【补几位0与x的最高次幂相同,模除就是进行异或】

crc校验码计算例题

crc校验码计算例题 1、若信息码字为11100011,生成多项式G(X)=X5+X4+X+1,则计算出的CRC 校验码为?x的最高次幂5则信息码(被除数)补五个0为:1110001100000 除数为110011 ------------10110110 --------------------- 110011/1110001100000 -------110011 ------------------ ---------101111 ---------110011 ------------------ ----------111000 ----------110011 ------------------ ------------101100 ------------110011 ------------------------ -------------111110 -------------110011 ------------------------- ---------------11010 2、信息码为101110101,生成多项式X4+X2+1,求冗余位??? 算法同上被除数补四个0 为:1011101010000 除数为:10101 答案:1100 7E 00 05 60 31 32 33 计算CRC16结果应该是:5B3E 方法如下: CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或(异或:二进制运算相同为0,不同为1;0^0=0;0^1=1;1^0=1;1^1=0),之后对CRC寄存器从

CRC16校验码如何计算

CRC16校验码如何计算 比如我有一个16进制只字符串 7E 00 05 60 31 32 33 要在末尾添加两个CRC16校验码校验这7个16进制字符请写出算法和答案 7E 00 05 60 31 32 33 计算CRC16结果应该是:5B3E 方法如下: 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值。 1.设置CRC寄存器,并给其赋值FFFF(hex)。 2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。 3.CRC寄存器向右

移一位,MSB补零,移出并检查LSB。 4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。 5.重复第3与第4步直到8次移位全部完成。此时一个8-bit 数据处理完毕。 6.重复第2至第5步直到所有数据全部处理完成。 7.最终CRC寄存器的内容即为CRC值。 CRC(16位)多项式为 X16+X15+X2+1,其对应校验二进制位列为1 1000 0000 0000 0101。

CRC_校验码的计算方法

CRC 校验码的计算方法 CRC从原理到实现=============== 作者:Spark Huang(hcpp@https://www.360docs.net/doc/0b9912802.html,) 日期:2004/12/8 摘要:CRC(Cyclic Redundancy Check)被广泛用于数据通信过程中的差错检测,具有很强的检错能力。本文详细介绍了CRC的基本原理,并且按照解释通行的查表算法的由来的思路介绍了各种具体的实现方法。 1.差错检测 数据通信中,接收端需要检测在传输过程中是否发生差错,常用的技术有奇偶校验(Parity Check),校验和(Checksum)和CRC(Cyclic Redundancy Check)。它们都是发送端对消息按照某种算法计算出校验码,然后将校验码和消息一起发送到接收端。接收端对接收到的消息按照相同算法得出校验码,再与接收到的校验码比较,以判断接收到消息是否正确。 奇偶校验只需要1位校验码,其计算方法也很简单。以奇检验为例,发送端只需要对所有消息位进行异或运算,得出的值如果是0,则校验码为1,否则为0。接收端可以对消息进行相同计算,然后比较校验码。也可以对消息连同校验码一起计算,若值是0则有差错,否则校验通过。 通常说奇偶校验可以检测出1位差错,实际上它可以检测出任何奇数位差错。 校验和的思想也很简单,将传输的消息当成8位(或16/32位)整数的序列,将这些整数加起来而得出校验码,该校验码也叫校验和。校验和被用在IP协议中,按照16位整数运算,而且其MSB(Most Significant Bit)的进位被加到结果中。 显然,奇偶校验和校验和都有明显的不足。奇偶校验不能检测出偶数位差错。对于校验和,如果整数序列中有两个整数出错,一个增加了一定的值,另一个减小了相同的值,这种差错就检测不出来。 2.CRC算法的基本原理------------------- CRC算法的是以GF(2)(2元素伽罗瓦域)多项式算术为数学基础的,听起来很恐怖,但实际上它 的主要特点和运算规则是很好理解的。 GF(2)多项式中只有一个变量x,其系数也只有0和1,如: 1*x^7 + 0*x^6 + 1*x^5 + 0*x^4 + 0*x^3 + 1*x^2 +1*x^1 + 1*x^0

CRC校验码的原理

CRC 校验码的原理 在通信与数字信号处理等领域中循环冗余校验码(Cyclic Redundancy Check,CRC )是一种很常用的设计。一般来说数据通信中的编码可以分为信源编码和信道编码两大类,其中,为了提高数据通信的可靠性而采取的编码称为信道编码,即抗干扰编码。在通信系统中,要求数据传输过程中的误码率足够低,而为了降低数据传输过程中的误码率,经常采用的一种方法是差错检测控制。 在实际的通信系统中,差错检测控制的主要方法又3种:前向纠错(FEC ),自动重发(ARQ )和反馈检验法。FEC 指接收端不仅能够在收到的信码中发现错码,而且还能够纠正错码。一般来说,这种方法不需要反向信道,实时性很好,不过设备较复杂。ARQ 是指接收端在收到的信码中检测出错码时,即设法通知发送端重新发送信号,直到能够正确接收为止。通常,这种方法只用来检测误码,而且只能在双向信道中使用。反馈检验法是指接收端将收到的信码一字不差地转发回发送端,同时与原发送信码进行比较,如果有错,则发端重发。这种方法的原理和设备都比较简单,但需要双向信道的支持,而且传输效率低下; 通过实践检验,在这三中方法中,如果传输过程中的误码率较低,那么采用前向纠错法比较理想,但如果误码率较高时,这种方法又会出现“乱纠”的现象;在网络通信中,广泛的采用差错检测方法时自动请求重发,这种方法只要检错功能即可;反馈检验法时前向纠错法和自动请求重发的结合。 在实现差错检测控制的众多方法中,循环冗余校验就是一类重要的线性分组码。它时一种高效的差错控制方法,它广泛应用于测控及数据通信领域,同时具有编码和解码方法简单,检错能力强,误判概率很低和具有纠错能力等优点。 循环冗余校验码实现的方法 CRC 的基本原理就是在一个P 位二进制数据序列之后附加一个R 位二进制检验码序列,从而构成一个总长位N=P+R 位的二进制序列。例如,P 位二进制数据序列D=[d 1-p d 2-p …d 1d 0],R 位二进制检验码R = [r 1-r r 2-r …r 1r 0],那么所得到的这个N 位二进制序列就是M=[d 1-p d 2-p …d 1d 0 r 1-r r 2-r …r 1r 0],这里附加在数据序列之后的CRC 码与数据序列的内容之间存在着某种特定的关系。如果在数据传输过程中,由于噪声或传输特性不理想而使数据序列中的某一位或某些位发生错误,这种特定关系就会被破坏。可见在数据的接收端通过检查这种特定关系,可以很容易地实现对数据传输正确性的检验。 在CRC 中,检验码R 使通过对数据序列D 进行二进制除法取余式运算得到的,他被一个称为生成多项式的(r+1)位二进制序列G=[g r g 1-r …g 1g 0]来除,具体的多项式除法形式如下: ) ()(x G x D x r =Q(x)+ ) ()(x G x R 其中,)(x D x r 表示将数据序列D 左移r 位,即在D 的末尾再增加r 个0位;Q (x )代表这一除法所得的商,R (x )就是所需的余式。此外,这一运算关系还可以表示为 ?? ? ???=)()(Re )(x G x D x x R r ?? ? ? ??=)()(Re )(x G x M x R 通过上面CRC 基本原理的介绍,可以发现生成多项式使一个非常重要的概念,它决定了CRC 的具体算法。目前,生成多项式具有一下一些通用标准,其中CRC -12,CRC -16,

CRC校验原理分析

CRC校验 校验原理: 1、循环校验码(CRC码):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。 2、生成CRC码的基本原理:任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。 3、CRC码集选择的原则:若设码字长度为N,信息字段为K位,校验字段为R 位(N=K+R),则对于CRC码集中的任一码字,存在且仅存在一个R次多项式g(x),使得 V(x)=A(x)g(x)=x R m(x)+r(x); 其中: m(x)为K次信息多项式, r(x)为R-1次校验多项式, g(x)称为生成多项式: g(x)=g 0+g 1 x+g 2 x2+...+g (R-1) x(R-1)+g R x R 发送方通过指定的g(x)产生CRC码字,接收方则通过该g(x)来验证收到的CRC 码字。 4、CRC校验码软件生成方法: 借助于多项式除法,其余数为校验字段。 例如:信息字段代码为: 1011001;对应m(x)=x6+x4+x3+1 假设生成多项式为:g(x)=x4+x3+1;则对应g(x)的代码为: 11001 x4m(x)=x10+x8+x7+x4对应的代码记为:10110010000; 采用多项式除法: 得余数为: 1010 (即校验字段为:1010)

发送方:发出的传输字段为: 1 0 1 1 0 0 1 1 0 10 信息字段校验字段 接收方:使用相同的生成码进行校验:接收到的字段/生成码(二进制除法)如果能够除尽,则正确,

16位CRC校验码计算程序

/*************************************************************** 16位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; *****************************************************************/ /**************************************************************************** 名称: UART_CRC16_Work() 说明: CRC16校验程序 参数: *CRC_Buf:数据地址 CRC_Leni:数据长度 返回: CRC_Sumx:校验值 *****************************************************************************/ unsigned int UART_CRC16_Work(unsigned char *CRC_Buf,unsigned char CRC_Leni) { unsigned char i,j; unsigned int CRC_Sumx; CRC_Sumx=0xFFFF; for(i=0;i>=1; CRC_Sumx^=0xA001; } else

CRC计算方法

1. CRC校验原理 CRC校验原理看起来比较复杂,好难懂,因为大多数书上基本上是以二进制的多项式形式来说明的。其实很简单的问题,其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“模2除法”)。到达接 收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。因为在发送端发送数据帧之 前就已通过附加一个数,做了“去余”处理(也就已经 能整除了),所以结果应该是没有余数。如果有余数,则表明该帧在传输过程中出现了差错。 【说明】“模2除法”与“算术除法”类似,但 它既不向上位借位,也不比较除数和被除数的相同位数值的大小,只要以相同位数进行相除即可。模2加法运算为:1+1=0,0+1=1,0+0=0,无进位,也无借位;模2减法运算为:1-1=0,0-1=1,1-0=1,0-0=0,也无进位,无借位。相当于二进制中的逻辑异或运算。也就是比较后,两者对应位相同则结果为“0”,不 同则结果为“1”。如100101除以1110,结果得到 商为11,余数为1,如图5-9左图所示。如 11×11=101,如图5-9右图所示。

图5-9 “模2除法”和“模2乘法”示例 具体来说,CRC校验原理就是以下几个步骤: (1)先选择(可以随机选择,也可按标准选择, 具体在后面介绍)一个用于在接收端进行校验时,对接收的帧进行除法运算的除数(是二进制比较特串,通常是以多项方式表示,所以CRC又称多项式编码 方法,这个多项式也称之为“生成多项式”)。 (2)看所选定的除数二进制位数(假设为k位),然后在要发送的数据帧(假设为m位)后面加上k-1 位“0”,然后以这个加了k-1个“0“的新帧(一共是 m+k-1位)以“模2除法”方式除以上面这个除数,所 得到的余数(也是二进制的比特串)就是该帧的 CRC校验码,也称之为FCS(帧校验序列)。但要 注意的是,余数的位数一定要是比除数位数只能少一位,哪怕前面位是0,甚至是全为0(附带好整除时)也都不能省略。 (3)再把这个校验码附加在原数据帧(就是m位 的帧,注意不是在后面形成的m+k-1位的帧)后面,构建一个新帧发送到接收端,最后在接收端再把这个新帧以“模2除法”方式除以前面选择的除数,如果没

CRC校验码计算详解

CRC校验码计算详解 以实例说明:2008年下半年上午试题(18)。 采用CRC进行差错检验,生成多项式为G(X)=X4+X+1,信息码字为10110,则计算出的CRC校验码是: A. 0000 B. 0100 C. 0010 D.1111 【分析】 符号表示假定:多项式和多项式的系数排列均用相同的符号表示,如 G(X)= X4+X+1 G(X)=10011 1.已知条件如下: 原码字记做M(X),即:M(X) = 10110 生成多项式记做G(X),即:G(X) = 10011 G(X)的最高阶数记做r,此处r = 4 2.计算步骤 (1)计算XrM(X) 也就是把M(X)的尾部添加r个0 XrM(X) = 10110 0000 (2)计算XrM(X)长除G(X),余数记做Y(X) 这里的“长除”计算方法如下: 10110 0000 10011 001010000 10011 0011100 10011 01111 注意Y(X)的位数为r(此处为4),所以Y(X) = 1111 Y(X)即是CRC校验码。 (3) 计算传输码字T(X) = XrM(X)-Y(X) 计算方法:在M(X)末尾连接上Y(X)即可 即:T(X) = 10110 1111 【答案】 此题只要计算出校验码Y(X)即可。正确答案为:D XrM(X) 10110 0000 -- G(X) 10011 (注意位对应方式,对应位进行异或运算即可) 00101 0000 -- G(X) 100 11 (计算方法同上) 001 1100 -- G(X) 100 11 01111 (此数已经小于G(X),计算到此为止,即Y(X))

CRC校验码编码实验

实验四CRC校验码编码实验 班级:电子C073 姓名:赵宣学号:075584 一、实验目的 1、复习C++语言基本编写方法,熟悉面向对象编程方法。 2、学习CRC编码基本流程, 学会调试循环冗余校验码编码程序。 3、根据给出资料,掌握CRC校验码的编码原理,重点掌握按字节(Byte)编码方法 二、实验内容与原理 (一)实验原理: 1. CRC 校验码介绍 CRC 校验的基本思想是利用线性编码理论,在发送端根据要传送的k 位二进制码序列,以一定的规则产生一个校验用的监督码(CRC 码)r 位,并附在信息后边,构成一个新的二进制码序列数共 (k+r) 位,最后发送出去。在接收端,则根据信息码和CRC 码之间所遵循的规则进行检验,以确定传送中是否出错。16 位的CRC 码产生的规则是先将要发送的二进制序列数左移16 位(乘以216)后,再除以一个多项式,最后所得到的余数既是CRC 码。求CRC 码所采用模2 加减运算法则,既是不带进位和借位的按位加减,这种加减运算实际上就是逻辑上的异或运算,加法和减法等价,乘法和除法运算与普通代数式的乘除法运算是一样,符合同样的规律。接收方将接收到的二进制序列数(包括信息码和CRC 码)除以多项式,如果余数为0,则说明传输中无错误发生,否则说明传输有误。 2.按位计算CRC 一个二进制序列数可以表示为 求此二进制序列数的CRC 码时,先乘以216后(左移16位),再除以多项式G(X) , 所得的余数就是所要求的CRC 码。 可以设: 其中Q n (X) 为整数, R n (X) 为16位二进制余数,将上式代入前式得: 再设: 其中Qn-1(X) 为整数, Rn-1(X) 为16位二进制余数,继续代入前式,多次迭代得到: 根据CRC 的定义,很显然,十六位二进制数R0(X) 即是要求的CRC 码。 3.按字节计算CRC 对于一个二进制序列数可以按字节表示为下式,其中Bn(X) 为一个字节(共8 位):

CRC校验算法-程序例子

变量定义 rtrig1:R_TRIG; execute: BOOL; command:ARRAY[0..255] OF BYTE; number: BYTE; command_temp: ARRAY [0..255] OF WORD; CRCHi: WORD; CRCLo: WORD; CRC_temp: WORD:=16#FFFF; i:INT; j:INT; k:INT; result: ARRAY [0..255] OF BYTE; CRC: WORD; 程序(绿色字体为CRC校验代码)rtrig1(CLK:=execute); IF rtrig1.Q THEN CASE command[1] OF 01,02,03,04,05,06: number:=6; 15,16: number:=7+command[6]; END_CASE; FOR i:=0 TO number BY 1 DO command_temp[i]:=BYTE_TO_WORD(command[i]); END_FOR; FOR j:=0 TO number BY 1 DO CRCHi:=CRC_temp AND 16#FF00; CRCLo:=CRC_temp AND 16#00FF; CRC_temp:=CRCHi OR (CRCLo XOR command_temp[j]); FOR k:= 0 TO 7 BY 1 DO IF CRC_temp.0 = 1 THEN CRC_temp:=SHR(CRC_temp,1); CRC_temp:=CRC_temp XOR 16#A001; ELSE CRC_temp:=SHR(CRC_temp,1); END_IF; END_FOR; END_FOR; CRC:=(CRCLo*16#0100) OR (CRCHi/16#0100); ELSE

CRC16查表计算

CRC16查表计算 参数1:要进行CRC计算的数组地址 参数2:要进行CRC计算的数组长度 /************************************************************************************* ************/ uint16 crc16(uint8 *puchMsg, uint16 usDataLen) { uint8 uchCRCHi = 0xFF ; /* 高CRC字节初始化*/ uint8 uchCRCLo = 0xFF ; /* 低CRC 字节初始化*/ uint32 uIndex ; /* CRC循环中的索引*/ while (usDataLen--) /* 传输消息缓冲区*/ { uIndex = uchCRCLo ^ *puchMsg++ ; /* 计算CRC */ uchCRCLo = uchCRCHi ^ auchCRCHi[uIndex] ; uchCRCHi = auchCRCLo[uIndex] ; } return (uchCRCHi << 8 | uchCRCLo) ; } const uint8 code auchCRCHi[] = { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,

CRC校验码计算过程

C R C校验码计算过程 Document serial number【UU89WT-UU98YT-UU8CB-UUUT-UUT108】

CRC 校验码 问题1设发送信息为,生成多项式g(x)=x5+x3+x2+1,求CRC 校验码。 解答:发送数据为f(x)=,多项式g(x)=101101 11111100 01100000000 001100 ___ __________000000 000110 ___ __________101101 101110 ___ __________101101 111010 ___ __________101101 110000 ___ __________101101 110101 ___ __________101101 110111 ___ __________101101 000 1101101100101101aaaaaaaa aaaaaaa aaaaaaa aaaaaa aaaaaa aaaaa aaaaa aaaa aaaa aaa aaa aa aa a a 所以校验字段R(x)=01100 则接受数据为f `(x)=; 验证接受的正确性:

11111100 000000_____________101101 101101 _____________101101 111011 _____________101101 110000 _____________101101 110101 _____________101101 110111 _____________101101 100 1101101101101101aaaaaa aaaaa aaaaa aaaa aaaa aaa aaa aa aa a a

CRC校验码系统设计.

南华大学电气工程学院 《通信原理课程设计》 设计题目: CRC校验码系统设计 专业:通信工程 学生姓名: 学号 起迄日期:2015年4月30日—2015年5月15日指导教师: 系主任:

目录 1概要 (3) 1.1 循环码的介绍 (3) 1.2校验原理 (3) 2 MATLAB基本介绍 (5) 2.1 MATLAB的介绍 (5) 2.2 MATLAB的组成部分 (5) 2.3 MATLAB的特点 (5) 2.4 MATLAB的优势 (6) 3 设计原理 (6) 3.1编码器模块 (6) 3.2译码器模块 (7) 4 设计思想 (9) 4.1程序流程图 (9) 5 CRC编解码系统的设计及实现 (10) 5.1程序设计 (10) 5.2系统仿真 (12) 6 总结......................................................................................... 错误!未定义书签。参考文献..................................................................................... 错误!未定义书签。

摘要 CRC(Cyclical Redundancy Checking)循环冗余校验码是一种重要的 线性分组码,通过多项式除法检测错误,是在数据通信和数据检测中广泛 应用的检错校验的循环码。 本设计研究了CRC循环冗余校验码的原理,以及利用C语言对其进行了编程和编译仿真,实现了CRC循环冗余校验码的编码及校验,在接收端收到通过校验的码,从而确定传输过程是否出错,得到的结论和理论上是一致的。在本次计中,使用的系统开发平台为MATLAB。设计方案中,实现了编码,纠错,译码。从循环的原理出发,讨论循环码编译码系统的特点。以一个(15,11)循环码的编译码的设计与仿真为例 ,使用C语言对该系统进行了设计。 关键词: MATLAB;C语言 ;CRC循环冗余校验码

CRC校验码计算过程#(精选.)

CRC 校验码 问题1设发送信息为11011011,生成多项式g(x)=x5+x3+x2+1,求CRC 校验码。 解答:发送数据为f(x)=11011011,多项式g(x)=101101 11111100 01100000000 001100 _____________000000 000110 ___ __________101101 101110 ___ __________101101 111010 ___ __________101101 110000 ___ __________101101 110101 ___ __________101101 110111 ___ __________101101 000 1101101100101101aaaaaaaa aaaaaaa aaaaaaa aaaaaa aaaaaa aaaaa aaaaa aaaa aaaa aaa aaa aa aa a a 所以校验字段R(x)=01100 则接受数据为f `(x)=1101101101100; 验证接受的正确性:

11111100 000000 ___ __________101101 101101 _____________101101 111011 ___ __________101101 110000 ___ __________101101 110101 ___ __________101101 110111 ___ __________101101 100 1101101101101101aaaaaa aaaaa aaaaa aaaa aaaa aaa aaa aa aa a a 最新文件 仅供参考 已改成word 文本 。 方便更改

关于CRC码的基本知识

一、CRC码工作原理 1. CRC校验原理 CRC的英文全称为Cyclic Redundancy Check(Code),中文名称为循环冗余校验(码)。它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差错控制。 CRC计算与普通的除法计算有所不同。普通的除法计算是借位相减的,而CRC计算则是异或运算。任何一个除法运算都需要选取一个除数,在CRC运算中我们称之为poly,而宽度W就是poly最高位的位置。比如poly 1001的W是3,而不是4。注意最高位总是1,当你选定一个宽度,那么你只需要选择低W各位的值。假如我们想计算一个位串的CRC码,并要保证每一位都要被处理,因此我们需要在目标位串后面加上W个0。 CRC校验原理看起来比较复杂,因为大多数书上基本上是以二进制的多项式形式来说明的。其实很简单的问题,其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“模2除法”)。到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。因为在

发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。如果有余数,则表明该帧在传输过程中出现了差错。 【说明】“模2除法”与“算术除法”类似,但它既不向上位借位,也不比较除数和被除数的相同位数值的大小,只要以相同位数进行相除即可。模2加法运算为:1+1=0,0+1=1,0+0=0,无进位,也无借位;模2减法运算为:1-1=0,0-1=1,1-0=1,0-0=0,也无进位,无借位。相当于二进制中的逻辑异或运算。也就是比较后,两者对应位相同则结果为“0”,不同则结果为“1”。如100101除以1110,结果得到商为11,余数为1,如图5-9左图所示。如11×11=101,如图5-9右图所示。 图5-9 “模2除法”和“模2乘法”示例 具体来说,CRC校验原理就是以下几个步骤:

相关文档
最新文档