CRC校验原理与程序设计——(RS485总线系统应用之1)

发布者:WanderlustSoul最新更新时间:2015-10-13 来源: eefocus关键字:CRC校验  RS485总线 手机看文章 扫描二维码
随时随地手机看文章
1.CRC校验原理

1.1 CRC的基本概念:

CRC是英文Cyclical Redundancy Check的缩写,翻译成中文通常称作循环冗余校验或简称为CRC校验。它是数据传输领域中最常用的一种差错校验方法,其特点是传输数据和CRC校验值的长度可以任意选定。在当今手机、计算机和数码产品普及的信息数字化时代,CRC校验无处不在。CRC分为多种标准,例如:CRC -12码通常用来传送6-bit字符串。CRC-16及CRC-CCITT码则用是来传送8-bit字符,其中CRC-16多为美国采用,而CRC-CCITT多为欧洲国家所采用。而CRC-32码大都被应用在Point-to-Point的同步传输中。更多的CRC校验标准类型参见附表:CRC校验标准类型。

1.2 CRC校验的基本原理:

    在代数编码理论中,一个数值可以表示为一个多项式。例如:一个十进制数值2892,可以用多项式表示为2x3 + 8x2 + 9x + 2(x=10)。同理,一个二进制数值1010101对应的多项式为x6 + x4 + x2 + 1(x=2)。

    生成CRC码的基本原理是:设被校验的数据为K位,校验码为R位,码字长度为N(=K+R),则对于CRC码集中的任一码字,存在且仅存在一个R次多项式g(x),使得

  V(x)=A(x)g(x)=xRm(x) + r(x);

  其中: m(x)为被校验数据的K-1次多项式

          r(x)为校验码的R-1次多项式

        g(x)称为生成多项式:g(x)=g0 + g1x1 + g2x2 + ... + g(R-1)x(R-1) + gRxR

    发送方通过指定的g(x)计算出CRC校验码,接收方则通过该g(x)来验证收到的CRC校验码。综上所述,一个完整的CRC校验过程是:

    发送方:根据要传送的K位原始数据(二进制码序列),以标准指定的多项式计算出一个R位校验码(CRC码),附在原始数据后边,构成一个新的二进制码序列共K + R位,然后发送出去。

    接收方:将接收到的数据除以与发送方相同的多项式值,如果能够除尽,则正确,否则证明出错。还有另外一种处理,就是接收方用发送方相同的方法计算出接收到数据的CRC校验值,再与发送方发来的校验值比较,相同则正确,否则证明出错。

2. CRC校验码的计算步骤:

例如:有一个要发送的7位二进制数1011001;对应的m(x)=x6 + x4 + x3 + 1。设CRC校验码取4位并设g(x)=x4 + x + 1,则该多项式对应的值是10011。根据CRC规则,为保证被除数够除,首先需将要发送的数扩大2R 即24倍(左移4位),得到10110010000,对应的xRm(x)=x10 + x8 + x7 + x4 。

    CRC校验码的生成本质其实就是采用模2除法取余数,该除法的简捷计算就是将除数和被除数按位做异或(相同为0,不同为1。0^0=0; 0^1=1; 1^0=1; 1^1=0)运算。需要注意的是,进行异或运算时除数必须和被除数最高有效位对齐。下面是将10110010000除以11001手工计算的演示,得到余数为1010,该值即是数据1011001的CRC校验值。

   10110010000            将1011001左移4位

   10011                  多项式值与被除数最高有效位对齐

  =00101010000            第1次异或结果

     10011                多项式值与被除数最高有效位对齐

  =00001100000            第2次异或结果

       10011              多项式值与被除数最高有效位对齐

  =00000101100            第3次异或结果

        10011             多项式值与被除数最高有效位对齐

  =00000001010            第4次异或结果

    为了简便计算机程序求解CRC,在实际应用中通常把多项式值的最高位舍掉,并且将参加计算的数据高低位颠倒后再计算。前面的演算数据颠倒后的运算情况如下:

    00001001101

          11001

    00001010100

        11001  

    00000110000

      11001   

    00110100000

     11001     

    01010000000

    提请注意:只有真正读懂以上手工演算的步骤和规律,才能理解下节内容。

3. CRC校验的程序设计

下面以最常用的CRC-16-IBM校验标准为例来说明CRC校验码的生成过程。 因为CRC-16码由两个字节构成,所以首先要准备一个16位的CRC寄存器,并将每一位都置1。具体的计算步骤为:

① 设置CRC寄存器,并给其赋值FFFFH。

② 将被校验数据的第一个字节(8Bit)与CRC寄存器的低8位进行异或,结果存CRC寄存器。

③ CRC寄存器的值向右移一位,最高位(MSB)补零,检查移出的最低位(LSB)是否为1。

④ 如果LSB为0,重复第三步;若LSB为1,CRC寄存器与CRC16多项式值A001H相异或。

⑤ 重复第③与第④步,直到该字节的8次移位全部完成。

⑥ 如果被校验数据有多个字节,则重复第②至第⑤步直到所有数据全部处理完。

⑦ 最终CRC寄存器的内容即为CRC值。

3.1 用查表法求CRC函数的程序

    查表法省去了将被校验数据移位并与多项式异或计算的步骤,因此比计算法更快捷,但程序编码量偏大。

3.1.1 用VC编写的程序

unsigned short CRC16(puchMsg, usDataLen)

unsigned char * puchMsg ;                    

unsigned short usDataLen ;                   

{

 unsigned char uchCRCHi = 0xFF ;            

 unsigned char uchCRCLo = 0xFF ;            

 unsigned uIndex ;                          

 while (usDataLen--)                        

  {

    uIndex = uchCRCLo ^ * puchMsg++ ;        

    uchCRCLo = uchCRCHi ^ auchCRCLo [uIndex] ;

    uchCRCHi = auchCRCHi [uIndex] ;

  }

  return (uchCRCLo << 8 | uchCRCHi) ;

}

 

 

static char auchCRCHi[] = {

  0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,

  0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,

  0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,

  0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,

  0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,

  0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,

  0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,

  0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,

  0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,

  0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,

  0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,

  0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,

  0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,

  0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,

  0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,

  0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,

  0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,

  0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,

  0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,

  0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,

  0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,

  0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,

  0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,

  0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,

  0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,

  0x43, 0x83, 0x41, 0x81, 0x80, 0x40 } ;

 

 

static unsigned char auchCRCLo[] = {

  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, 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,

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

  0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 } ;

 

3.1.2 用VB编写的程序

Private Function CRC16(data() As Byte) As String

 Dim CRC16Hi As Byte

 Dim CRC16Lo As Byte

 CRC16Hi = &HFF

 CRC16Lo = &HFF

 Dim i As Integer

 Dim iIndex As Long

 For i = 0 To UBound(data)

  iIndex = CRC16Lo Xor data(i)

  CRC16Lo = CRC16Hi Xor GetCRCLo(iIndex)    ’低位处理

CRC16Hi = GetCRCHi(iIndex)                ’高位处理

 Next i

 Dim ReturnData(1) As Byte

 ReturnData(0) = CRC16Hi                     ’CRC高位

 ReturnData(1) = CRC16Lo                     ’CRC低位

 CRC16 = ReturnData

End Function

 

Function GetCRCHi(Ind As Long) As Byte     ’CRC高位字节值表

GetCRCHi = Choose(Ind + 1,_

  &H00, &HC0, &HC1, &H01, &HC3, &H03, &H02, &HC2, &HC6, &H06,_

  &H07, &HC7, &H05, &HC5, &HC4, &H04, &HCC, &H0C, &H0D, &HCD,_

  &H0F, &HCF, &HCE, &H0E, &H0A, &HCA, &HCB, &H0B, &HC9, &H09,_

  &H08, &HC8, &HD8, &H18, &H19, &HD9, &H1B, &HDB, &HDA, &H1A,_

  &H1E, &HDE, &HDF, &H1F, &HDD, &H1D, &H1C, &HDC, &H14, &HD4,_

  &HD5, &H15, &HD7, &H17, &H16, &HD6, &HD2, &H12, &H13, &HD3,_

  &H11, &HD1, &HD0, &H10, &HF0, &H30, &H31, &HF1, &H33, &HF3,_

  &HF2, &H32, &H36, &HF6, &HF7, &H37, &HF5, &H35, &H34, &HF4,_

  &H3C, &HFC, &HFD, &H3D, &HFF, &H3F, &H3E, &HFE, &HFA, &H3A,_

  &H3B, &HFB, &H39, &HF9, &HF8, &H38, &H28, &HE8, &HE9, &H29,_

  &HEB, &H2B, &H2A, &HEA, &HEE, &H2E, &H2F, &HEF, &H2D, &HED,_

  &HEC, &H2C, &HE4, &H24, &H25, &HE5, &H27, &HE7, &HE6, &H26,_

  &H22, &HE2, &HE3, &H23, &HE1, &H21, &H20, &HE0, &HA0, &H60,_

  &H61, &HA1, &H63, &HA3, &HA2, &H62, &H66, &HA6, &HA7, &H67,_

  &HA5, &H65, &H64, &HA4, &H6C, &HAC, &HAD, &H6D, &HAF, &H6F,_

  &H6E, &HAE, &HAA, &H6A, &H6B, &HAB, &H69, &HA9, &HA8, &H68,_

  &H78, &HB8, &HB9, &H79, &HBB, &H7B, &H7A, &HBA, &HBE, &H7E,_

  &H7F, &HBF, &H7D, &HBD, &HBC, &H7C, &HB4, &H74, &H75, &HB5,_

  &H77, &HB7, &HB6, &H76, &H72, &HB2, &HB3, &H73, &HB1, &H71,_

  &H70, &HB0, &H50, &H90, &H91, &H51, &H93, &H53, &H52, &H92,_

  &H96, &H56, &H57, &H97, &H55, &H95, &H94, &H54, &H9C, &H5C,_

  &H5D, &H9D, &H5F, &H9F, &H9E, &H5E, &H5A, &H9A, &H9B, &H5B,_

  &H99, &H59, &H58, &H98, &H88, &H48, &H49, &H89, &H4B, &H8B,_

  &H8A, &H4A, &H4E, &H8E, &H8F, &H4F, &H8D, &H4D, &H4C, &H8C,_

  &H44, &H84, &H85, &H45, &H87, &H47, &H46, &H86, &H82, &H42,_

  &H43, &H83, &H41, &H81, &H80, &H40)

End Function

 

Function GetCRCLo(Ind As Long) As Byte     ’CRC低位字节值表

GetCRCLo = Choose(Ind + 1,_

  &H00, &HC1, &H81, &H40, &H01, &HC0, &H80, &H41, &H01, &HC0,_

  &H80, &H41, &H00, &HC1, &H81, &H40, &H01, &HC0, &H80, &H41,_

  &H00, &HC1, &H81, &H40, &H00, &HC1, &H81, &H40, &H01, &HC0,_

  &H80, &H41, &H01, &HC0, &H80, &H41, &H00, &HC1, &H81, &H40,_

  &H00, &HC1, &H81, &H40, &H01, &HC0, &H80, &H41, &H00, &HC1,_

  &H81, &H40, &H01, &HC0, &H80, &H41, &H01, &HC0, &H80, &H41,_

  &H00, &HC1, &H81, &H40, &H01, &HC0, &H80, &H41, &H00, &HC1,_

  &H81, &H40, &H00, &HC1, &H81, &H40, &H01, &HC0, &H80, &H41,_

  &H00, &HC1, &H81, &H40, &H01, &HC0, &H80, &H41, &H01, &HC0,_

  &H80, &H41, &H00, &HC1, &H81, &H40, &H00, &HC1, &H81, &H40,_

  &H01, &HC0, &H80, &H41, &H01, &HC0, &H80, &H41, &H00, &HC1,_

  &H81, &H40, &H01, &HC0, &H80, &H41, &H00, &HC1, &H81, &H40,_

  &H00, &HC1, &H81, &H40, &H01, &HC0, &H80, &H41, &H01, &HC0,_

  &H80, &H41, &H00, &HC1, &H81, &H40, &H00, &HC1, &H81, &H40,_

  &H01, &HC0, &H80, &H41, &H00, &HC1, &H81, &H40, &H01, &HC0,_

  &H80, &H41, &H01, &HC0, &H80, &H41, &H00, &HC1, &H81, &H40,_

  &H00, &HC1, &H81, &H40, &H01, &HC0, &H80, &H41, &H01, &HC0,_

  &H80, &H41, &H00, &HC1, &H81, &H40, &H01, &HC0, &H80, &H41,_

  &H00, &HC1, &H81, &H40, &H00, &HC1, &H81, &H40, &H01, &HC0,_

  &H80, &H41, &H00, &HC1, &H81, &H40, &H01, &HC0, &H80, &H41,_

  &H01, &HC0, &H80, &H41, &H00, &HC1, &H81, &H40, &H01, &HC0,_

  &H80, &H41, &H00, &HC1, &H81, &H40, &H00, &HC1, &H81, &H40,_

  &H01, &HC0, &H80, &H41, &H01, &HC0, &H80, &H41, &H00, &HC1,_

  &H81, &H40, &H00, &HC1, &H81, &H40, &H01, &HC0, &H80, &H41,_

  &H00, &HC1, &H81, &H40, &H01, &HC0, &H80, &H41, &H01, &HC0,_

  &H80, &H41, &H00, &HC1, &H81, &H40)
End Function

3.2 用计算法求CRC函数的程序

    计算法的优点是程序编码量小,虽然比查表法速度偏慢,但当被校验的数据量不大时并不明显。

3.2.1 用VC编写的程序

unsigned short CRC16(unsigned char buf[], int n)

{

   unsigned short crc = 0xffff ;

   for(i = 0; i < n; i++)

   {

      crc ^ = buf[i] ;

      for(b = 0; b < 8; b++)

     {

        bool f = crc & 1 ;

        crc >> = 1 ;

        if(f)

        crc ^ = 0xa001 ;

      }

    }

   return(crc) ;

}

 

3.2.2 用VB编写的程序

Function CRC16(Data() As Byte, No As Integer, CRC16Lo As Byte, CRC16Hi As Byte) As String

   Dim CL As Byte, CH As Byte, SaveLo As Byte, SaveHi As Byte

   CRC16Hi = &HFF                            '为16位CRC校验寄存器赋初始值 FFFF

   CRC16Lo = &HFF

   CH = &HA0                                 '为16位CRC校验多项式赋初始值 A001

   CL = &H1

   For i = 1 To No

      CRC16Lo = CRC16Lo Xor Data(i - 1)      '每一个数据与CRC寄存器进行异或

      For j = 1 To 8

         SaveHi = CRC16Hi

         SaveLo = CRC16Lo

         CRC16Hi = CRC16Hi 2               '高位右移一位

         CRC16Lo = CRC16Lo 2               '低位右移一位

         If ((SaveHi And &H1) = &H1) Then    '如果高位字节最右一位为1

            CRC16Lo = CRC16Lo Or &H80        '则低位字节最左一位补1,否则自动补0

         End If

         If ((SaveLo And &H1) = &H1) Then    '如低位字节最右一位为1,则与多项式值异或

            CRC16Hi = CRC16Hi Xor CH

            CRC16Lo = CRC16Lo Xor CL

         End If

      Next j

   Next i

End Function

 

参考文献:

① GB/T 19582.1-2008《基于Modbus协议的工业自动化网络规范》

②《Modbus协议中文版》  可在互联网上下载

 

  

附表:  CRC校验标准类型

CRC校验名

多    项    式    (标准引用名)

对应的16进制值或反值注:已去掉最高位的1

CRC-1

x + 1 (most hardware; also known as parity bit)

01 或 01 (01)

CRC-4-ITU

x4 + x + 1 (ITU G.704, p. 12)

03 或 0C (09)

CRC-5-ITU

x5 + x4 + x2 + 1 (ITU G.704, p. 9)

15 或 15 (1A)

CRC-5-USB

x5 + x2 + 1 (USB token packets)

05 或 14 (12)

CRC-6-ITU

x6 + x + 1 (ITU G.704, p. 3)

03 或 30 (21)

CRC-7

x7 + x3 + 1 (telecom systems, MMC,SD)

09 或 48 (44)

CRC-8-ATM

x8 + x2 + x + 1 (ATM HEC)

07 或 E0 (83)

CRC-8-CCITT

x8 + x7 + x3 + x2 + 1 (1-Wire bus)

8D 或 B1 (C6)

CRC-8-Dallas/Maxim

x8 + x5 + x4 + 1 (1-Wire bus)

31 或 8C (98)

CRC-8

x8 + x7 + x6 + x4 + x2 + 1

D5 或 AB (EA)

CRC-8-SAE J1850

x8 + x4 + x3 + x2 + 1

1D 或 B8 (8E)

CRC-10

x10 + x9 + x5 + x4 + x + 1

233 或 331 (319)

CRC-11

x11 + x9 + x8 + x7 + x + 1 (FlexRay)

385 或 50E (5C2)

CRC-12

x12 + x11 + x3 + x2 + x + 1 (telecom systems )

80F 或 F01 (C07)

CRC-15-CAN

x15 + x14 + x10 + x8 + x7 + x4 + x3 + 1

4599 或 4CD1 (62CC)

CRC-16-Fletcher

Not a CRC; see Fletcher's checksum

Used in Adler-32 A & B CRCs

CRC-16-CCITT

x16 + x12 + x5 + 1 (CRC-CCITT, G.hn PHY headers, 802.15.4, X.25, V.41, CDMA, Bluetooth, XMODEM, HDLC,PPP, IrDA, BACnet, MMC,SD)

1021 或 8408 (8810)

CRC-16-DNP

x16 + x13 + x12 + x11 + x10 + x8 + x6 + x5 + x2+ 1 (DNP, IEC 870, M-Bus)

3D65 或 A6BC (9EB2)

CRC-16-IBM

x16 + x15 + x2 + 1 (CRC-16, SDLC, USB, many others)

8005 或 A001 (C002)

CRC-24-Radix-64

x24 + x23 + x18 + x17 + x14 + x11 + x10 + x7 +x6 + x5 + x4 + x3 + x + 1 (FlexRay)

864CFB 或 DF3261 (C3267D)

CRC-30

x30 + x29 + x21 + x20 + x15 + x13 + x12 + x11 +x8 + x7 + x6 + x2 + x + 1 (CDMA)

2030B9C7 或 38E74301 (30185CE3)

CRC-32-Adler

Not a CRC; see Adler-32

See Adler-32

CRC-32-IEEE 802.3

x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 +x8 + x7 + x5 + x4 + x2 + x + 1 (V.42, MPEG-2, PNG [10], POSIX cksum)

04C11DB7 或 EDB88320 (82608EDB)

CRC-32C (Castagnoli)

x32 + x28 + x27 + x26 + x25 + x23 + x22 + x20 + x19 + x18 + x14 + x13 + x11 + x10 + x9 + x8 + x6 + 1 (G.hn payload)

1EDC6F41 或 82F63B78 (8F6E37A0)

CRC-32K (Koopman)

x32 + x30 + x29 + x28 + x26 + x20 + x19 + x17 +x16 + x15 + x11 + x10 + x7 + x6 + x4 + x2 + x + 1

741B8CD7 或 EB31D82E (BA0DC66B)

CRC-64-ISO

x64 + x4 + x3 + x + 1 (HDLC-ISO 3309)

000000000000001B 或D800000000000000 (800000000000000D)

CRC-64-ECMA-182

x64 + x62 + x57 + x55 + x54 + x53 + x52 + x47 + x46 + x45 + x40 + x39 + x38 + x37 + x35 + x33 + x32 + x31 + x29 + x27 + x24 + x23 + x22 + x21 + x19 + x17 + x13 + x12 + x10 + x9 + x7 + x4 + x + 1 (As described in ECMA-182 p.51)

42F0E1EBA9EA3693 或C96C5795D7870F42 (A17870F5D4F51B49)

 

关键字:CRC校验  RS485总线 引用地址:CRC校验原理与程序设计——(RS485总线系统应用之1)

上一篇:RS-485总线布线规则及方法——(RS485总线系统应用之4)
下一篇:Modbus协议的常用基本定义——(RS485总线系统应用之2)

推荐阅读最新更新时间:2024-05-03 00:01

RS485转PROFIBUS总线桥在称重系统中的应用
称重仪表在各行各业中都有使用,在现代工业生产中,经常需要将多种原料按一定的比例混合,以制造某种产品,这种将一种原料与其它几种原料按事先设定的比例进行混合配料的配料称重系统在工业生产过程中应用应用广泛,它能根据事先设定的配料单,将各种不同的原料在不同的称重设备中进行称量配料。 遗憾的是绝大部分的仪表只带有串口或者是485口,这和它最初设计出来是和电脑的串口相连有关,随着现场总线在各个领域中的运用,如何称重仪表接入现场系统中将会是大家比较关心的一个问题。微硬创新RS485转PROFIBUS总线桥产品可以将各种RS485接口称重仪表连接到以西门子PLC为主控制器的自动配料装置的称重系统中。 使用RS485转PROFIBUS总线桥连接到
[嵌入式]
基于C167CS微控制器的数字化电梯系统
   摘要 : 基于C167CS 微控制器设计了数字化电梯系统, 该系统中利用多规则加权的模糊控制算法进行群控控制,以CAN总线多主方式实现各控制器间的串行通信。该系统提高了电梯的运行效率,并增强了电梯运行的实时性控制,系统的灵活性与可靠性得到了提高。    1 引言   国民经济的飞速发展, 现代化程度日益提高,高层建筑愈来愈多, 电梯也随之增多, 电梯产品在人们物质文化生活中的地位得到了提高,成为重要的运输设备之一。国内传统的电梯控制一是由继电器、接触器构成。它不仅存在着可靠性差、成本高、故障率高等缺点,而且在层数增加时,配线变化给制造及安装带来诸多不变。若用微机来控制电梯具有许多优点,进而数字化电梯控制系统是发展的必然
[单片机]
RS485总线浅析
1.1 RS485 总线简介          RS-485 标准是由两个行业协会共同制订和开发的,即EIA—电子产业协会和TIA—通讯产业协会。EIA 曾经在它所有标准前面加上RS 前缀英文Rcommended standard 的缩写,因此很多工程师一直延用这种名称。 1.2 RS485 总线应用场合        RS-485 总线作为一种多点差分数据传输的电气规范规,已成为业界应用最为广泛的标准通讯接口之一。这种通讯接口答应在简单的一对双绞线上进行多点双向通讯,它所具有的噪声抑制能力、数据传输速率、电缆长度及可靠性是其他标准无法相比的。正由于此,很多不同领域都采用RS-485 作为数据传输链路。例如:汽车电子、电信设备局
[嵌入式]
RS485总线型通讯系统应用
1  引言 在自动化控制领域,随着分布式控制系统的发展,在产业上的分布式控制系统中,经常需要采用串行通讯来达到远程信息交换的目的。目前,用于串行通讯的接口标准包括:rs-232、rs-422、rs-423和rs-485。rs-232是最早的串行接口标准,广泛应用在短间隔、较低波特率串行通讯中。其后发展起来的rs-422、rs-485是平衡传送的电气标准,比起rs-232非平衡的传送方式在电气指标上有了大幅度的进步。rs-485串行接口的电气标准实际上是rs-422的变型,它属于七层osi(open system interconnection,开放系统互连)模型物理层的协议标准。由于性能优异、结构简单、组网轻易,rs-485总
[嵌入式]
基于RS485总线的面粉厂集散控制系统
    1 面粉厂的基本情况     1.1 生产工艺     面粉厂的加工工艺较简单,简单地说就是加入麦子磨成粉。然而作为一条自动生产线从加入麦子磨成粉再装成袋,也不是一件容易的事。首先麦子经过管道处理后定量的由漏斗称向磨机加入麦子,磨机加工出面粉,通过不同位置的管道分离出3种面粉及肤皮,他们分别称为1号粉F1,2号粉F2,3号粉F3和肤皮Br及被加工的麦子量B1。3种面粉和肤皮在其各自管道的出口处经各自的漏斗称流出,而后经过各自的传输带传输到包装工序由包装机自动装袋封口。     1.2 原系统概况     厂里有3个车间,一个车间是一条面粉加工生产线,实际上就是一台磨机及其庞大的管道辅助设备。这3条生产线完全一样
[嵌入式]
逻辑分析仪如何长期监控RS485总线通讯?
RS485是一种非常常用的差分通信总线,传输距离较远,抗干扰性也很好。但是对于通讯过程中的偶然故障,如何才能实现长达几小时,甚至是几天的通信过程监控呢? 测试需求:低成本长期监控RS485总线通信过程。 测试难点:RS485本身是差分总线,需要使用差分探头才能准确捕获信号,但业内很少有逻辑分析仪的差分探头,而且价值非常昂贵。 测试步骤: 1、先用示波器配合普通探头看一下波形,如图1。 图 1示波器配合普通探头捕获的波形 我们可以清楚的看到在通讯协议信号上叠加了非常大的共模干扰。这个共模干扰会完全扰乱协议阈值电平的判断,无论是示波器还是逻辑分析仪,都无法设置出一个合理的阈值电平来进行解码。 2、
[测试测量]
逻辑分析仪如何长期监控<font color='red'>RS485</font><font color='red'>总线</font>通讯?
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

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

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