CRC算法及工作原理

发布者:创意旋律最新更新时间:2010-10-21 关键字:CRC检验  算法  工作原理 手机看文章 扫描二维码
随时随地手机看文章
  CRC检验

  CRC校验实用程序库 在数据存储和数据通讯领域,为了保证数据的正确,就不得不采用检错的手段。在诸多检错手段中,CRC是最著名的一种。CRC的全称是循环冗余校验,其特点是:检错能力极强,开销小,易于用编码器及检测电路实现。从其检错能力来看,它所不能发现的错误的几率仅为0.0047%以下。从性能上和开销上考虑,均远远优于奇偶校验及算术和校验等方式。因而,在数据存储和数据通讯领域,CRC无处不在:著名的通讯协议X.25的FCS(帧检错序列)采用的是CRC- CCITT,WinRAR、NERO、ARJ、LHA等压缩工具软件采用的是CRC32,磁盘驱动器的读写采用了CRC16,通用的图像存储格式GIF、TIFF等也都用CRC作为检错手段。

  CRC的本质是模-2除法的余数,采用的除数不同,CRC的类型也就不一样。通常,CRC的除数用生成多项式来表示。最常用的CRC码的生成多项式如表1所示。

  @@10A08800.GIF;表1.最常用的CRC码及生成多项式@@

  由于CRC在通讯和数据处理软件中经常采用,笔者在实际工作中对其算法进行了研究和比较,总结并编写了一个具有最高效率的CRC通用程序库。该程序采用查表法计算CRC,在速度上优于一般的直接模仿硬件的算法,可以应用于通讯和数据压缩程序。

  算法

  通常的CRC算法在计算一个数据段的CRC值时,其CRC值是由求解每个数值的CRC值的和对CRC寄存器的值反复更新而得到的。这样,求解 CRC的速度较慢。通过对CRC算法的研究,我们发现:一个8位数据加到16位累加器中去,只有累加器的高8位或低8位与数据相作用,其结果仅有256种可能的组合值。因而,我们可以用查表法来代替反复的运算,这也同样适用于CRC32的计算。本文所提供的程序库中,函数crchware是一般的16位 CRC的算法;mk-crctbl用以在内存中建立一个CRC数值表;crcupdate用以查表并更新CRC累加器的值;crcrevhware和 crcrevupdate是反序算法的两个函数;BuildCRCTable、CalculateBlockCRC32和UpdateCharacterCRC32用于CRC32的计算。

  /* CRC.C——CRC程序库 */
  #define CRCCCITT 0x1021
  #define CCITT-REV 0x8408
  #define CRC16 0x8005
  #define CRC16-REV 0xA001
  #define CRC32-POLYNOMIAL 0xEDB88320L
  /* 以上为CRC除数的定义 */
  #define NIL 0
  #define crcupdate(d,a,t)*(a)=(*(a)<<8)^(t)[(*(a)>>8)^(d)];
  #define crcupdate16(d,a,t)*(a)=(*(a)>>8^(t)[(*(a)^(d))&0x00ff])
  /* 以上两个宏可以代替函数crcupdate和crcrevupdate */
  #include #include #include /* 函数crchware是传统的CRC算法,其返回值即CRC值 */ unsigned short crchware(data,genpoly,accum)
  unsigned short data;/* 输入的数据 */
  unsigned short genpoly;/* CRC除数 */
  unsigned short accum;/* CRC累加器值 */
  {
  static int i;
  data<<=8;
  for(i=8;i>0;i--)
  {
  if((data^accum)&0x8000)
  accum=(accum<<1)^genpoly;
  else
  accum<<=1;
  data<<=1;
  }
 
 
  return (accum);
  }
  /* 函数mk-crctbl利用函数crchware建立内存中的CRC数值表 */
  unsigned short *mk-crctbl(poly,crcfn);
  unsigned short poly;/* CRC除数--CRC生成多项式 */
  R>unsigned short (*crcfn)();/* 指向CRC函数(例如crchware)的指针 */
  {
  /* unsigned short */malloc(); */
  unsigned short *crctp;
  int i;
  if((crctp=(unsigned short*)malloc(256*sizeof(unsigned)))==0)
  return 0;
  for(i=0;i<256;i++)
  crctp=(*crcfn)(i,poly,0);
  return crctp;
  }
  /* 函数mk-crctbl的使用范例 */
  if((crctblp=mk-crctbl(CRCCCITT,crchware))==NIL)
  {
  puts("insuff memory for CRC lookup table.n");
  return 1; */
  /* 函数crcupdate用以用查表法计算CRC值并更新CRC累加器值 */
  void crcupdate(data,accum,crctab)
  unsigned short data;/* 输入的数据 */
  unsigned short *accum;/* 指向CRC累加器的指针 */
  unsigned short *crctab;/* 指向内存中CRC表的指针 */
  {
  static short comb-val;
  comb-val=(*accum>>8)^data;
  *accum=(*accum<<8)^crctab[comb-val];
  }
 
 
  /* 函数crcrevhware是传统的CRC算法的反序算法,其返回值即CRC值 */
  unsigned short crcrevhware(data,genpoly,accum)
  unsigned short data;
  unsigned short genpoly;
  unsigned short accum;
  {
  static int i;
  data<<=1;
  for(i=8;i>0;i--)
  {
  data>>=1;
  if((data^accum)&0x0001)
  accum=(accum>>1)^genpoly;
  else
  accum>>=1;
  }
  return accum;
  }
  /* 函数crcrevupdate用以用反序查表法计算CRC值并更新CRC累加器值 */
  void crcrevupdate(data,accum,crcrevtab)
  unsigned short data;
  unsigned short *accum;

  CRC检验方法的工作原理

  循环冗余码CRC在发送端编码和接收端校验时,都可以利用事先约定的生成多项式G(X)来得到,k位要发送的信息位可对应一个(k-1)次多项式K(X),r位冗余位对应于一个(r-1)次多项式R(X),由k位信息位后面加上r位冗余位组成的n=k+r的码字则对应于一个(n-1)次多项式 T(X)X×K(X)+R(X)。也即在发送端产生一个循环冗余码,附加在信息位后面一起发送到接收端。接收端的检验过程就是将接收到的码字多项式除以 G(X),若余式为零则认为传输无差错;若余式不为零则传输有差错。

  CRC - Crazy Roller Crew

  CRC英文全称是Crazy Roller Crew,是疯狂轮滑阵线(CRF)核心成员团体。

  CRC是疯狂轮滑阵线组织力量和轮滑技术的核心,服务于疯狂轮滑阵线的技术团队,由阵线会员组成。但绝非纯技术团队,亲和力及沟通能力作为基本条件存在。荣誉承担疯狂轮滑阵线的各种对外技术交流活动。

关键字:CRC检验  算法  工作原理 引用地址:CRC算法及工作原理

上一篇:基于LON总线的图像采集系统智能节点的开发
下一篇:基于MSP430单片机的Profibus-DP通信接口

推荐阅读最新更新时间:2024-03-16 12:30

适用于MCU的TinyissimoYOLO轻量化视觉检测算法
虽然在更大、更强大的硬件上运行的人工智能 (AI) 算法经常成为人们关注的焦点,但不应低估边缘 AI 的重要性。 边缘人工智能是指将人工智能算法部署在本地设备上,如智能手机、相机、传感器和其他物联网设备,而不是仅仅依赖基于云端的解决方案。 这种去中心化的方法提供了许多好处,并解锁了更广泛的应用空间。 边缘 AI 的主要优势之一是减少延迟。 通过本地处理数据,边缘人工智能消除了往返云端的需要,从而加快了响应时间。 这种实时能力在即时决策场景中至关重要,例如自动驾驶汽车、工业自动化和关键基础设施监控。 此外,边缘人工智能增强了隐私和安全性,因为敏感数据保留在本地设备上,从而降低了数据泄露的风险并确保了用户的隐私。 尽管有众多优
[单片机]
基于键盘扫描算法的多路断电报警系统设计
随着当代通信技术的发展,技术设备在航空系统、军队、工业等领域的应用已成业务运行的根本保障,大多数设备需24 h无间断供电,这就要求对电源有智能检测和实时的监控,以便及时处理断电事故,保障设备正常运行。而在实际应用中,为了确保有足够的时间抢修断电线路,通常在设备供电中采用多路供电,形成一主用、二备用、三应急的构架。因此,在多路断电线路中实时检测断电线路并进行报警已经成为及时恢复正常供电的关键。本文提出基于改进型的键盘扫描算法,通过设计相关检测硬件电路和监控软件,对多路供电系统进行智能检测报警和远程监控。 1 系统结构 本系统已在民航汕头空管站信标台机房投入使用,下面以其为例简述设计基本结构。 系统硬件部分主要由检测硬件电路
[电源管理]
基于键盘扫描<font color='red'>算法</font>的多路断电报警系统设计
STM32的GPIO工作原理
STM32引脚说明 GPIO是通用输入/输出端口的简称,是STM32可控制的引脚。GPIO的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。 STM32F103ZET6芯片为144脚芯片,包括7个通用目的的输入/输出口(GPIO)组,分别为GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF、GPIOG,同时每组GPIO口组有16个GPIO口。通常简略称为PAx、PBx、PCx、PDx、PEx、PFx、PGx,其中x为0-15。 STM32的大部分引脚除了当GPIO使用之外,还可以复用位外设功能引脚(比如串口),这部分在【STM32】STM32端口复用和重映射(AFIO
[单片机]
STM32的GPIO<font color='red'>工作原理</font>
机器视觉测试系统构成、工作原理及种类分析
1.引言 现代工业自动化生产中涉及到各种各样的检验、生产监视和零件识别应用,如汽车零配件批量加工的尺寸检查和自动装配的完整性检查、电子装配线的元件自动定位、IC上的字符识别等。通常这种带有高度重复性和智能性的工作是由肉眼来完成的,但在某些特殊情况下,如对微小尺寸的精确快速测量、形状匹配以及颜色辨识等,依靠肉眼根本无法连续稳定地进行,其它物理量传感器也难以胜任。人们开始考虑用CCD照相机抓取图像后送入计算机或专用的图像处理模块,通过数字化处理,根据像素分布和亮度、颜色等信息来进行尺寸、形状、颜色等的判别。这种方法是把计算机处理的快速性、可重复性与肉眼视觉的高度智能化和抽象能力相结合,由此产生了机器视觉测试技术的概念。 视觉测试技
[测试测量]
机器视觉测试系统构成、<font color='red'>工作原理</font>及种类分析
插入式流量传感器工作原理及结构形式
插入式流量传感器工作原理是基于法拉第电磁感应定律。在电磁流量传感器中,测量管内的导电介质相当于法拉第试验中的导电金属杆,上下两端的两个电磁线圈产生恒定磁场。当有导电介质流过时,则会产生感应电压。管道内部的两个电极测量产生的感应电压。测量管道通过不导电的内衬(橡胶,特氟隆等)实现与流体和测量电极的电磁隔离。 插入式流量传感器有两种结构形式,即点流速计型和径流速计型。 1、点流速计型传感器 点流速计型传感器由测量头、插入杆、插入机构和转换器组成。常见的点流速计型的传感器包括插入式涡街流量传感器、插入式涡轮流量传感器、插入式超声波流量传感器和插入式电磁流量传感器等。 几种常用的点流速计型传感器的主要特点如下: 插入式
[嵌入式]
闭环霍尔电流传感器的工作原理
介绍了闭环霍尔电流传感器的工作原理及在地面车用电源系统中的应用,实现了对车用电源系统输出电流的隔离测量、控制,解决了地面车辆的大功率发电系统的限流保护问题。 关键词:闭环;霍尔电流传感器;车用电源;应用 1 引言 地面车用电源系统(以下简称电源系统)输出电流的检测与控制,直接关系着电源系统工作的稳定性和可靠性,并影响车辆的运行状况及车辆的可操作性。由于车辆复杂的使用条件导致车用电源的负载变化较大,随之电源的输出功率也将发生较大变化,若对电源的输出电流不加限制,会造成电源因过载而发热,影响其功率输出,严重情况下会导致电源永久失效。 闭环霍尔电流传感器(以下简称传感器)在车用电源系统中的应用,实现了对电源系统输
[电源管理]
闭环霍尔电流传感器的<font color='red'>工作原理</font>
选频放大器的工作原理与双T电桥的频率特性
选频放大器的 工作原理与双T电桥的频率特性 选频放大器,它从多种频率的输入信号中,选取所需的一种频率信号加以放大下图所示的方框图可以构成选频放大电路,其中方框K是基本放大电路,方框F是选频负反馈网络,因此,选频放大器实质上是一种具有选频作用的负反馈电路。电路的闭环益为 KF=K/(1+FK) 式中:K=UO/Ui是开环增益 F=UF/UO 是反馈系数 一般用RC选频网络实现选期,图(b)示出反馈系数F随频率f的变化曲线(频率特性),当f=fo时,则F=0。所以,对谐振频率fo来说,放大电路不存在负反馈,故KF=K,此时放大器的输出电压最大。随着频率远离fo,F就急速地增加,相
[模拟电子]
选频放大器的<font color='red'>工作原理</font>与双T电桥的频率特性
浅论蓄电池工作原理及使用误区
蓄电池是电池中的一种,它的作用是能把有限的电能储存起来,在合适的地方使用。它的工作原理就是把化学能转化为电能。   它用填满海绵状铅的铅板作负极,填满二氧化铅的铅板作正极,并用22~28%的稀硫酸作电解质。在充电时,电能转化为化学能,放电时化学能又转化为电能。电池在放电时,金属铅是负极,发生氧化反应,被氧化为硫酸铅;二氧化铅是正极,发生还原反应,被还原为硫酸铅。电池在用直流电充电时,两极分别生成铅和二氧化铅。移去电源后,它又恢复到放电前的状态,组成化学电池。铅蓄电池是能反复充电、放电的电池,叫做二次电池。它的电压是2V,通常把三个铅蓄电池串联起来使用,电压是6V。汽车上用的是6个铅蓄电池串联成12V的电池组。铅蓄电池在使
[电源管理]
浅论蓄电池<font color='red'>工作原理</font>及使用误区
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

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

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