MODBUS接收返回过来的数据时,要进行CRC校验 第一个是我在网上下的,是CRC校验证,和网上对比是正确的。 public static byte[] CRCCalc(byte[] data)
{
//1.预置1个16位的寄存器为十六进制FFFF(即全为1); 称此寄存器为CRC寄存器;
//crc计算赋初始值
var crc = 0xffff;
for (var i = 0; i < data.Length; i++)
{
//2.把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低8位相异或,把结果放于CRC寄存器;
crc = crc ^ data; //将八位数据与crc寄存器异或 ,异或的算法就是,两个二进制数的每一位进行比较,如果相同则为0,不同则为1 //3.把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;
//4.如果移出位为0:重复第3步(再次右移一位); 如果移出位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
//5.重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
for (var j = 0; j < 8; j++)
{
int temp;
temp = crc & 1;
crc = crc >> 1;
crc = crc & 0x7fff;
if (temp == 1) crc = crc ^ 0xa001;
crc = crc & 0xffff;
}
} //CRC寄存器的高低位进行互换
可是我看了别人的一个程序,他的返回的CRC校验不一样,不知道他这是怎么回事, 先传入要校验的数据 public ushort CalculateCrc16(byte[] buffer, out byte crcLo, out byte crcHi)//协议默认低位在前
{
crcHi = 0xff; // high crc byte initialized
crcLo = 0xff; // low crc byte initialized for (int i = 0; i < buffer.Length - 2; i++)
{
int crcIndex = crcHi ^ buffer; // calculate the crc lookup index crcHi = (byte)(crcLo ^ _auchCRCHi[crcIndex]);
crcLo = _auchCRCLo[crcIndex];
} return (ushort)(crcHi << 8 | crcLo);
} |