您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>电子百科>通信技术>数据通信>

8位crc校验分析及程序

2017年12月04日 10:28 网络整理 作者: 用户评论(0

  CRC 中的生成多项式,是有很多标准的。其统一的规律是:最高位、最低位都为1。8位CRC校验通常用的是CRC-8,其生成多项式为:107H = 1 0000 0111B进行异或运算时,最高位,就算是移出去了,因此,只用 07H 进行异或计算即可。

  CRC校验实用程序库 在数据存储和数据通讯领域,为了保证数据的正确,就不得不采用检错的手段。在诸多检错手段中,CRC是最著名的一种。CRC的全称是循环冗余校验,其特点是:检错能力极强,开销小,易于用编码器检测电路实现。从其检错能力来看,它所不能发现的错误的几率仅为0.0047%以下。

  从性能上和开销上考虑,均远远优于奇偶校验及算术和校验等方式。因而,在数据存储和数据通讯领域,CRC无处不在:著名的通讯协议X.25的FCS(帧检错序列)采用的是CRC-CCITT,WinRAR、NERO、ARJ、LHA等压缩工具软件采用的是CRC32,磁盘驱动器的读写采用了CRC16,通用的图像存储格式GIF、TIFF等也都用CRC作为检错手段。下面介绍硬件生成与计算CRC的过程。

  8位CRC校验程序

  //本程序是完成CRC-8的方程式为X^8+X^2+X+1的源代码,经调试后正确通过!

  #include “reg52.h”

  #define CRCnum 5

  char CRCArray[CRCnum]={0x16,0x0f,0x17,0xe9,0x03};//需要CRC计算一串数0x160f17e903

  unsigned char cal_crc(unsigned char *ptr, unsigned char len);

  void main()

  {

  char CRC;

  CRC=cal_crc(CRCArray,CRCnum);//得到CRC的代码

  }

  unsigned char cal_crc(unsigned char *ptr, unsigned char len)

  {

  unsigned char i; unsigned char crc=0; while(len--!=0)

  {

  for(i=0x80; i!=0; i/=2)

  {

  if((crc&0x80)!=0)

  {

  crc*=2; crc^=0x07;

  } /* 余式CRC乘以2再求CRC */

  else

  crc*=2;

  if((*ptr&i)!=0)

  crc^=0x07; /* 再加上本位的CRC */ } ptr++;

  }

  return(crc);

  }

  CRC8位校验程序分析

  crc8校验查表法实现方法——查表法 生成多项式X^8+X^6+X^4+X^3+X^2+X^1

  const uchar crctable[] = {

  0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,

  157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220,

  35,125,159,193, 66, 28,254,160,225,191, 93, 3,128,222, 60, 98,

  190,224, 2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,

  70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7,

  219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154,

  101, 59,217,135, 4, 90,184,230,167,249, 27, 69,198,152,122, 36,

  248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185,

  140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,

  17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,

  175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,

  50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,

  202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139,

  87, 9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,

  233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,

  116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53};

  备注:在数据传输中CRC或传过来的数据,可能低字节在前,高字节在后,这就造成查表法表中被查数据不同。

  unsigned char crc_array[256] = {

  0x00, 0x5e, 0xbc, 0xe2, 0x61, 0x3f, 0xdd, 0x83,

  0xc2, 0x9c, 0x7e, 0x20, 0xa3, 0xfd, 0x1f, 0x41,

  0x9d, 0xc3, 0x21, 0x7f, 0xfc, 0xa2, 0x40, 0x1e,

  0x5f, 0x01, 0xe3, 0xbd, 0x3e, 0x60, 0x82, 0xdc

  0x23, 0x7d, 0x9f, 0xc1, 0x42, 0x1c, 0xfe, 0xa0,

  0xe1, 0xbf, 0x5d, 0x03, 0x80, 0xde, 0x3c, 0x62,

  0xbe, 0xe0, 0x02, 0x5c, 0xdf, 0x81, 0x63, 0x3d,

  0x7c, 0x22, 0xc0, 0x9e, 0x1d, 0x43, 0xa1, 0xff,

  0x46, 0x18, 0xfa, 0xa4, 0x27, 0x79, 0x9b, 0xc5,

  0x84, 0xda, 0x38, 0x66, 0xe5, 0xbb, 0x59, 0x07,

  0xdb, 0x85, 0x67, 0x39, 0xba, 0xe4, 0x06, 0x58,

  0x19, 0x47, 0xa5, 0xfb, 0x78, 0x26, 0xc4, 0x9a,

  0x65, 0x3b, 0xd9, 0x87, 0x04, 0x5a, 0xb8, 0xe6,

  0xa7, 0xf9, 0x1b, 0x45, 0xc6, 0x98, 0x7a, 0x24,

  0xf8, 0xa6, 0x44, 0x1a, 0x99, 0xc7, 0x25, 0x7b,

  0x3a, 0x64, 0x86, 0xd8, 0x5b, 0x05, 0xe7, 0xb9,

  0x8c, 0xd2, 0x30, 0x6e, 0xed, 0xb3, 0x51, 0x0f,

  0x4e, 0x10, 0xf2, 0xac, 0x2f, 0x71, 0x93, 0xcd,

  0x11, 0x4f, 0xad, 0xf3, 0x70, 0x2e, 0xcc, 0x92,

  0xd3, 0x8d, 0x6f, 0x31, 0xb2, 0xec, 0x0e, 0x50,

  0xaf, 0xf1, 0x13, 0x4d, 0xce, 0x90, 0x72, 0x2c,

  0x6d, 0x33, 0xd1, 0x8f, 0x0c, 0x52, 0xb0, 0xee,

  0x32, 0x6c, 0x8e, 0xd0, 0x53, 0x0d, 0xef, 0xb1,

  0xf0, 0xae, 0x4c, 0x12, 0x91, 0xcf, 0x2d, 0x73,

  0xca, 0x94, 0x76, 0x28, 0xab, 0xf5, 0x17, 0x49,

  0x08, 0x56, 0xb4, 0xea, 0x69, 0x37, 0xd5, 0x8b,

  0x57, 0x09, 0xeb, 0xb5, 0x36, 0x68, 0x8a, 0xd4,

  0x95, 0xcb, 0x29, 0x77, 0xf4, 0xaa, 0x48, 0x16,

  0xe9, 0xb7, 0x55, 0x0b, 0x88, 0xd6, 0x34, 0x6a,

  0x2b, 0x75, 0x97, 0xc9, 0x4a, 0x14, 0xf6, 0xa8,

  0x74, 0x2a, 0xc8, 0x96, 0x15, 0x4b, 0xa9, 0xf7,

  0xb6, 0xe8, 0x0a, 0x54, 0xd7, 0x89, 0x6b, 0x35,

  };

非常好我支持^.^

(1) 100%

不好我反对

(0) 0%

( 发表人:龚婷 )

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!