Vaisala CRC16

来源:互联网 发布:uptodate数据库 编辑:程序博客网 时间:2024/05/16 09:03

CRC-16 COMPUTATION
  The computation of the CRC is performed on the data response before parity is added. All operations are assumed to be on 16 bit unsigned integers. The least significant bit is on the right. Numbers preceded by 0x are in hexadecimal. All shifts shift in a zero. The algorithm is:
Initialize the CRC to zero. For each character beginning with the address, up to but not including the carriage return (<cr>), do as follows:
{
  Set the CRC equal to the exclusive OR of the character and itself
  for count =1 to 8
  {
    if the least significant bit of the CRC is one
    {
      right shift the CRC one bit
      set CRC equal to the exclusive OR of 0xA001 and itself
    }else{
      right shift the CRC one bit
    }
  }
}


Encoding the CRC as ASCII Characters
  The 16 bit CRC is encoded to three ASCII characters by using the following algorithm:
  1st character = 0x40 OR (CRC shifted right 12 bits)
  2nd character = 0x40 OR ((CRC shifted right 6 bits) AND 0x3F)
  3rd character = 0x40 OR (CRC AND 0x3F)

  The three ASCII characters are placed between the data and <cr><lf>.
  Parity is applied to all three characters, if selected for the character frame.
  The CRC computation code is added to the end of the response, if the first letter of the command is sent by using lower case.


void CRC16(BYTE *Array, BYTE *Rcvbuf,unsigned int Len)
{
  unsigned int IX,IY,CRC;
  CRC=0;
  if (Len<=0)
  {
    CRC = 0;
  }else{
    Len--;
    for (IX=0;IX<=Len;IX++)
    {
      CRC=CRC^(unsigned int)(Array[IX]);
      for(IY=0;IY<=7;IY++)
      {
        if ((CRC&1)!=0)
        {
          CRC=(CRC>>1)^0xA001;
        }else{
          CRC=CRC>>1;
        }
      }
    }
  }
   Rcvbuf[0] = 0x40 | (CRC >> 12);//高位置
   Rcvbuf[1] = 0x40 | ((CRC >> 6) & 0x3F);//中位置
   Rcvbuf[2] = 0x40 | (CRC & 0x3F);//低位置
}

原创粉丝点击