CRC校验最终个人总结
CRC校验最终个人总结:某二进制信息码(kn)的CRC校验需选
择一个合适的g(x)除数(校验因子)如:CRC-7为X+X+1=10001001
73宽度为7,此校验因子根据设计的需求来选择(如:CRC-32/CRC-16)。注意,在计算CRC前必须将二进制信息码左移7位(kn*2),这里的7来源于所选择的检验因子的宽度。然后,再与除数进行模2运算(从kn的最高位开始和除数进行异或运算)。最后所剩的宽度为7的7位余数就是最终CRC计算结果(当计算到只剩7位余数时就不要再计算了)。之后就可以将经过CRC校验后的信息码+CRC一起发送给对方,对方收到添有CRC的信息码后,将这串代码再和校验因子进行异或运算看结果是否为0。例如:kn=01000000=0x40g(x)=X+X+1=10001001宽度为7
1:移位01000000左移7位=100000000000002:异或运算
10000000000000
10001001校验因子1001000000
10001001
1100100最终CRC计算结果3:传输发送
10000001100100
信息码CRC结果4:接收检验
10000001100100
10001001校验因子1000100100
10001001校验因子0
73扩展阅读:单片机crc校验实验报告
单片机课程总实验
实现CRC校验
一、实验目的
⒈通过学习CRC原理,验证,检错,掌握其工作原理;⒉编写CRC编码程序;
⒊总结实验过程,编写提交实验报告:方案、编程、调试、结果、分析、结论。二、实验要求
用单片机实现CRC校验码(10比特数据或任意数据长度、生成多项式用G(x)=x5+x4+x2+1),校验码显示在单片机实验系统数码管上。二、实验器材
1、装有KeilC51开发工具的PC机一台
2、TD-PIT/TD-PIT-B实验装置一套
三、实验原理
1.设置CRC寄存器,并给其赋初始值。
2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。
3.CRC寄存器向右移一位,最高位补零,移出并检查最低位。
4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。6.重复第2至第5步直到所有数据全部处理完成。
7.最终CRC寄存器的内容即为CRC值。常用的CRC循环冗余校验标准多项式如下:CRC(12位)=X12+X11+X3+X2+X+1CRC(16位)=X16+X15+X2+1CRC(CCITT)=X16+X12+X5+1CRC(32位)=X32+X26+X23+X16+X12+X11+X10+X8+X7+X5+X4+X2+X+1以CRC(16位)多项式为例,其对应校验二进制位列为11000000000000101本次实验以10比特为例。显示到六位数码管中。
其实验连接图如下图所示。四、实验步骤
1.打开KeilC51开发工具,新建开发工具,并保存至相应路径。2.新建文件,编写代码。
3.按照实验连线图在实验箱上连线。
4.编译运行代码勿误后,打开实验箱,点击调试,运行。
五、实验结果
经过调试程序,在实验箱数码管上显示二进制数001110.
六、实验源代码#include"Absacc.h"
#defineC8255_AXBYTE[0x7F00]//8255端口地址定义#defineC8255_BXBYTE[0x7F01]#defineC8255_CXBYTE[0x7F02]#defineC8255_CONXBYTE[0x7F03]//数码管显示编号
unsignedchara[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsignedcharb[]={0x00,0x00,0x00,0x00,0x00,0x00};longMD;longGD;
voiddelay(unsignedinttime){unsignedinti;for(i=0;i
C8255_B=a[b[i]];//查表输出显示C8255_A=j;delay(0x100);j=(j>>1)|(j=1;MD=tmp;
tmp=GD;//数GD有多少位tmp用于暂存GDfor(count_GD=0;GD!=0;count_GD++)GD>>=1;GD=tmp;
//构造CRC码序列
for(tmp=1;tmp
{if(tst0==(tst0&MD))//MD与最高位为1当除不尽时最高位为0,
//余数比除数少一位
{MD^=GD;//异或除法,被除数应该异或之后少一位}
tst0>>=1;//位数减一,最高位降低一位
GD>>=1;//除数保持和被除数最高位对齐,相当于竖式除法左对齐}i=0;
while(1)//转化为2进制输出,16进制数模2取余,移位{b[i]=MD%2;i++;MD/=2;if(MD==0||i>6)break;}}
voidmain(){
C8255_CON=0x81;//8255初始化CRC_check(0x28D,0x35);//16进制
while(1)//显示{
display();delay(0x80);clear();
}}七、实验心得
实验指导书上写的还是很好懂,只是最初接触的时候确实感觉代码好多陌生,因为这个调用机制,变量基本上都是公有变量,直接在函数里面使用,赋值,在另一个函数里面接着用。看起来函数都是无参和无返回值的。不过后来仔细看了之后发现这个了之后,使用起来还是蛮顺手的了。虽然还是习惯使用带参数的函数,但是不用写返回值这一点倒也能适应。在除法实现方面,通过百度找到了一种模拟竖式除法的方式,左对齐,异或,根据结果商数,再左对齐,异或。如此就采用了除数与被除数位数对齐,除数不足位数补0的方式,因为0与任何数异或还是它本身,所以用0补足之后,除数和被除数整体异或的结果和竖式除法左对齐异或的结果是一样的。M位除以N位,每次异或之后结果会降低一位,最终会得到M-N+1位商和N-1位余数或者0余数。
友情提示:本文中关于《CRC校验最终个人总结》给出的范例仅供您参考拓展思维使用,CRC校验最终个人总结:该篇文章建议您自主创作。
来源:网络整理 免责声明:本文仅限学习分享,如产生版权问题,请联系我们及时删除。