CRC-16/MODBUS算法

  

<强> CRC-16/MODBUS算法:
在CRC计算时只用8个数据位,起始位及停止位,如有奇偶校验位也包括奇偶校验位,都不参与CRC计算。
CRC计算方法是:
1,加载一值为0 xffff的16位寄存器,此寄存器为CRC寄存器。
2,把第一个8位二进制数据(即通讯信息帧的第一个字节)与16位的CRC寄存器的相异或、异或的结果仍存放于该CRC寄存器中。
3,把CRC寄存器的内容右移一位,用0填补最高位,并检测移出位是0还是1。
4,如果移出位为零,则重复第三步(再次右移一位),如果移出位为1,CRC寄存器与0 xa001进行异或。
5,重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理。
6,重复步骤2和5,进行通讯信息帧下一个字节的处理。
7日将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换
8,最后得到的CRC寄存器内容即为:CRC校验码。

  

c#代码:

  
 <代码>空白ModBusCRC16 (ref byte [] cmd, int len)
  {
  ushort i, j、tmp CRC16;
  
  CRC16=0 xffff;//CRC寄存器初始值
  (我=0;我& lt;兰;我+ +)
  {
  CRC16 ^=cmd[我];
  (j=0;j & lt;8;j + +)
  {
  tmp=(ushort) (CRC16,0 x0001);
  CRC16祝辞祝辞=1;
  如果(tmp==1)
  {
  CRC16 ^=0 xa001;//异或多项式
  }
  }
  }
  cmd[我+ +=(字节)(CRC16,0 x00ff);
  (+ +)cmd=(字节)((CRC16,0 xff00)在祝辞8);
  } 

CRC-16/MODBUS算法