单片机指令:165、90、16、8、1、0、0、0、0、0、0、2、86、95(缓冲区读到的数据),最后两位是单片机的校验位。
十六进制的话应该是:0xA5,0x5A....指令头为0xA5,0x5A,校验位56、5F(十进制位86,95)两位。
现在取中间有效数据16、8、1、0、0、0、0、0、0、2这段数据做CRC16校验,代码
for (int i = 2; i < len + 4; i++)//这里len=8,指令第四位数字
{
by = CheckCRC16.CalculateCrc16(buffer[i]);
s6 = by.ToString("X");
}
/// <summary>
///CRC16 校验函数
/// </summary>
/// <param name="buffer"></param>
/// <returns></returns>
public static ushort CalculateCrc16(byte buffer)
{
byte crcHi = 0xff; // 高位初始化 byte crcLo = 0xff; // 低位初始化 int crcIndex = crcHi ^ buffer; //查找crc表值
crcHi = (byte)(crcLo ^ _auchCRCHi[crcIndex]);
crcLo = _auchCRCLo[crcIndex]; return (ushort)(crcHi << 8 | crcLo);
}
现在问:by = CheckCRC16.CalculateCrc16(buffer[i]);
执行代码后为什么by的值跟单片机指令的最后两位校验位不正确,错在哪里了请高手们指点!!
十六进制的话应该是:0xA5,0x5A....指令头为0xA5,0x5A,校验位56、5F(十进制位86,95)两位。
现在取中间有效数据16、8、1、0、0、0、0、0、0、2这段数据做CRC16校验,代码
for (int i = 2; i < len + 4; i++)//这里len=8,指令第四位数字
{
by = CheckCRC16.CalculateCrc16(buffer[i]);
s6 = by.ToString("X");
}
/// <summary>
///CRC16 校验函数
/// </summary>
/// <param name="buffer"></param>
/// <returns></returns>
public static ushort CalculateCrc16(byte buffer)
{
byte crcHi = 0xff; // 高位初始化 byte crcLo = 0xff; // 低位初始化 int crcIndex = crcHi ^ buffer; //查找crc表值
crcHi = (byte)(crcLo ^ _auchCRCHi[crcIndex]);
crcLo = _auchCRCLo[crcIndex]; return (ushort)(crcHi << 8 | crcLo);
}
现在问:by = CheckCRC16.CalculateCrc16(buffer[i]);
执行代码后为什么by的值跟单片机指令的最后两位校验位不正确,错在哪里了请高手们指点!!
/// <summary>
/// CRC16
/// </summary>
/// <param name="buffer"></param>
/// <returns></returns>
public static ushort CalculateCrc16(byte[] buffer)
{
byte crcHi = 0xff; // 高位初始化 byte crcLo = 0xff; // 低位初始化 for (int i = 0; i < buffer.Length; i++)
{
int crcIndex = crcHi ^ buffer[i]; //查找crc表值
crcHi =(byte)(crcLo ^_auchCRCHi[crcIndex]);
crcLo =_auchCRCLo[crcIndex];
}
return (ushort)(crcHi << 8 | crcLo);
}