单片机指令: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的值跟单片机指令的最后两位校验位不正确,错在哪里了请高手们指点!!

解决方案 »

  1.   

    校验函数发错了,是这个
            /// <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);
            }