C语言:CRC校验

发布者:qiuxubiao最新更新时间:2015-01-19 来源: 51hei关键字:C语言  CRC校验 手机看文章 扫描二维码
随时随地手机看文章
一、CRC码
CRC:Cylic Reduancy check译作汉语就是循环冗余校验码。
 
二、XOR
XOR:逻辑运算符异或,不知道用符号怎么写,总之其运算法则是,不同为1,相同为0。
 
三、用XOR代替算术运算上除法的两个例子。
1、10110010000/11001
第一次异或(相除),得到商为1,余数为1111,加入下一位0,进行
第二次异或,得到商为1,余数为111,加入下一位1,余数为1111,四位与除数5位不能够异或计算,所以此处商为0,加入下一位0,进行
第三次异或,得到商为1,余数为111,同理第5位商为0,余数继续加入被除数的下一位0,进行
第四次异或,得到商为1,余数为101,加入后一位被除数的0,得到商为0,最终余数为1010,而最终商为1101010。计算流程如下图所示:

如若让被除数10110010000加上余数1010则为10110011010,再除以(异或)11001,则得到余数为0000(此处不再具体计算).
2、1111000/1001
经过三次异或(相除)得到商为1110,余数为110,具体例程如下,

同样,让该例的被除数1111000加上余数110后为1111110除以(异或)除数100则得到余数为000.
 
四、CRC校验原理
由以上两个例子可以看出,通信过程中加入想要传送的数据是“被除数”,加上余数后再传送。而接收一方接收完整数据后,除以除数,如果余数为0,则说明传送的数据正确,如果不为0则说明传送的数据有误。因为对于一个确定的“除数”,则就会有唯一的余数与之对应。这个过程其实就是一个CRC的校验过程。不过名称改一下不能叫做被除数除数什么的。可以规定上述的除数叫做生成多项式或生成项,用g(x)表示。而余数就叫做CRC校验码。由以上知道,对于不同的生成项,则就会有唯一的CRC校验码与之对应。而对于要传送的数据也可以用一个系数仅为0和1取值的多项式一一对应。例如代码1010111对应的多项式为x^6+x^4+x^2+x+1.而多项式x^5+x^3+x^2+x+1对应的代码是101111.
实际上,上述的被除数并不是真正的要传送的数据,真正要传送的数据是一个多项式左移CRC校验码位数后的代码。定义CRC校验码的位数表示它本身的宽度。
另外,关于生成项,不难发现其最高位是1,实际上在除法的每次XOR时候都要被消掉,所以一般第一个1不做参考,后面的几位才是最重要的。这就是为什么生成项的位数比CRC宽度大1的原因。且生成项的最后一位也必须同时为1.一般生成项简写时候不写最高位的1.以下是各种常用的生成项表达式:
CRC-4:x^4+x+1;-------------------------------->0x03
CRC-8:x^8+x^5+x^4+1;--------------------------->0x31
CRC-8:x^8+x^2+x^1+1;--------------------------->0x07
CRC-8:x^8+x^6+x^4+x^3+x^2+x;------------------->0x5E
CRC-12:x^12+x^11+x^4+x^3+x+1;------------------>0x80
CRC-16:x^16+x^15+x^2+1;------------------------>0x80005
CRC-16:x^16+x^12+x^5+1;------------------------>0x1021
CRC-32:x^32+x^26+x^23+....+x^2+x+1;------------>0x04C11DB7
CRC-32:x^32+x^28+x^27+....+x^8+x^6+1;---------->0x1EDC6F41
 
五、C语言的实现
 
 
 
 
 
附录:
关键字:C语言  CRC校验 引用地址:C语言:CRC校验

上一篇:C语言中 const 的用法
下一篇:无线射频芯片CC1100e的编程

推荐阅读最新更新时间:2024-03-16 13:51

小容量单片机系统的C语言程序结构
引 言:   2002年初,笔者着手写一个IC卡预付费电表的工作程序,该电表使用Philips公司的8位51扩展型单片机87LPC764,要求实现很多功能,包括熄显示、负荷计算与控制、指示闪烁以及电表各种参数的查询等,总之,要使用时间的单元很多。笔者当时使用ASM51完成了这个程序的编写,完成后的程序量是2KB多一点。后来,由于种种原因,这个程序并没有真正使用,只是作了一些改动之后用在一个老化设备上进行计时与负荷计算。约一年后,笔者又重新改写了这些代码。 1 系统的改进   可以说,这个用ASM51实现的代码是没有什么组织性可言的,要什么功能就加入什么功能,弄得程序的结构非常松散,其实这也是导致笔者最终决定重新改写这些代
[单片机]
单片机c语言教程第十三章--C51循环语句
循环语句是几乎每个程序都会用到的,它的作用就是用来实现需要反复进行多次的操 作。如一个 12M 的 51 芯片应用电路中要求实现 1 毫秒的延时,那么就要执行 1000 次空语句 才能达到延时的目的(当然能使用定时器来做,这里就不讨论),如果是写 1000 条空语 句那是多么麻烦的事情,再者就是要占用很多的存储空间。我们能知道这 1000 条空语句, 无非就是一条空语句重复执行 1000 次,因此我们就能用循环语句去写,这样不但使程序 结构清晰明了,而且使其编译的效率大大的提高。在 C 语言中构成循环控制的语句有 while,do-while,for 和 goto 语句。同样都是起到循环作用,但具体的作用和使用方法又大不一 样
[单片机]
单片机C语言中code是什么意思
在51系列中data,idata,xdata,pdata的区别 code:程序存储区。 data:固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。 idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似C中的指针方式访问的。汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idata做指针式的访问效果很好) xdata:外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。 pdata:外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用mov
[单片机]
PIC单片机CCS之C语言(#IFDEF,#ENDIF的用法)
#IFDEF #IFNDEF #ELSE #ELIF #ENDIF 语法: #ifdef id cide #elif code #else code #endif 和 #ifndef id code #elif code #else code #endif id是一个预处理器标识符,code是一段有效的C源程序. 目的:这个指示的执行同#IF相似.在#IF里,如果指定的ID(用#DEFINE 创建的ID)对预处理器来说是已知的, 预处理器完全可以检查到它;而在#IFDEF里,如果ID被定义了,则预处理器可以检查到它,若没有定义ID,则#IFNDEF可以检查到它. 例子: #define d
[单片机]
C语言一百例第四例
代码: /* C语言第四例 题目:输入某年某月某日,判断这一天是这一年的第几天? 程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。 */ #include stdio.h void main(void) { int year,month,day,sum,temp; printf( 请输入日期年月日:n ); scanf( %d,%d,%d ,&year,&month,&day); switch(month) //假设现在是三月,则前两个月天数加起来,再加本月天数即可 { case 1:su
[单片机]
<font color='red'>C语言</font>一百例第四例
指针在c语言中的妙用
指针,任何一个计算机语言都少不了的好东西。特殊问题,特殊对待。函数指针就是这么一个特殊的例子。比如: void Run(void) { PORTB = ~PORTB; } 这个函数我们可以直接在main()里调用它,也可以使用指针。如下所示: void (*fun)(void); int main() { fun = Run; fun(); return 0; } 使用指针有很多优点,关于指针的基本概念可以参考的第十六课: http://www.51hei.com/mcuteach/133.html ,如果我们定义了一个指针数组,就可以同时调用多个已知的函数,在不需要调用的时候再将它删除。特
[单片机]
单片机C语言编程规范
  一、基本要求 1.1 程序结构清析,简单易懂,单个函数的程序行数不得超过100行。 1.2 打算干什么,要简单,直接了当,代码精简,避免垃圾程序。 1.3 尽量使用标准库函数和公共函数。 1.4 不要随意定义全局变量,尽量使用局部变量。 1.5 使用括号以避免二义性。   二、可读性要求 2.1 可读性第一,效率第二。 2.2 保持注释与代码完全一致。 2.3 每个源程序文件,都有文件头说明,说明规格见规范。 2.4 每个函数,都有函数头说明,说明规格见规范。 2.5 主要变量(结构、联合、类或对象)定义或引用时,注释能反映其含义。 2.7 常量定义(DEFINE)有相应说明。
[单片机]
基于C语言STC89C52单片机电子密码锁的设计与仿真
搜索: IC库存 认证库存 PDF 文章 用户名: 密码: 社区 企业 免费注册 iframe marginWidth=0 marginHeight=0 src="http://afp21ic.allyes.com/main/adfshow?user=Afp21ic|MCU|logo_left&db=afp21ic&border=0&local=yes" frameBorder=0 width=758 scrolling=no height=64 /iframe 首页 资讯: 新闻 应用 新品 eBooks 电路图
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved