#include "main.h" #include "CRC.h" //======================CRC8计算=============================================== //CRC表,数据表结束共256个字节 const unsigned char CRC8_TABLE[256]={ 0X00,0X5E,0XBC,0XE2,0X61,0X3F,0XDD,0X83, 0XC2,0X9C,0X7E,0X20,0XA3,0XFD,0X1F,0X41, 0X9D,0XC3,0X21,0X7F,0XFC,0XA2,0X40,0X1E, 0X5F,0X01,0XE3,0XBD,0X3E,0X60,0X82,0XDC, 0X23,0X07,0X9F,0XC1,0X42,0X1C,0XFE,0XA0, 0XE1,0XBF,0X5D,0X03,0X80,0XDE,0X3C,0X62, 0XBE,0XE0,0X02,0X5C,0XDF,0X81,0X63,0X3D, 0X7C,0X22,0XC0,0X9E,0X1D,0X43,0XA1,0XFF, 0X46,0X18,0XFA,0XA4,0X27,0X79,0X9B,0XC5, 0X84,0XDA,0X38,0X66,0XE5,0XBB,0X59,0X07, 0XDB,0X85,0X67,0X39,0XBA,0XE4,0X06,0X58, 0X19,0X47,0XA5,0XFB,0X78,0X26,0XC4,0X9A, 0X65,0X3B,0XD9,0X87,0X04,0X5A,0XB8,0XE6, 0XA7,0XF9,0X1B,0X45,0XC6,0X98,0X7A,0X24, 0XF8,0XA6,0X44,0X1A,0X99,0XC7,0X25,0X7B, 0X3A,0X64,0X86,0XD8,0X5B,0X05,0XE7,0XB9, 0X8C,0XD2,0X30,0X6E,0XED,0XB3,0X51,0X0F, 0X4E,0X10,0XF2,0XAC,0X2F,0X71,0X93,0XCD, 0X11,0X4F,0XAD,0XF3,0X70,0X2E,0XCC,0X92, 0XD3,0X8D,0X6F,0X31,0XB2,0XEC,0X0E,0X50, 0XAF,0XF1,0X13,0X4D,0XCE,0X90,0X72,0X2C, 0X6D,0X33,0XD1,0X8F,0X0C,0X52,0XB0,0XEE, 0X32,0X6C,0X8E,0XD0,0X53,0X0D,0XEF,0XB1, 0XF0,0XAE,0X4C,0X12,0X91,0XCF,0X2D,0X73, 0XCA,0X94,0X76,0X28,0XAB,0XF5,0X17,0X49, 0X08,0X56,0XB4,0XEA,0X69,0X37,0XD5,0X8B, 0X57,0X09,0XEB,0XB5,0X36,0X68,0X8A,0XD4, 0X95,0XCB,0X29,0X77,0XF4,0XAA,0X48,0X16, 0XE9,0XB7,0X55,0X0B,0X88,0XD6,0X34,0X6A, 0X2B,0X75,0X97,0XC9,0X4A,0X14,0XF6,0XA8, 0X74,0X2A,0XC8,0X96,0X15,0X4B,0XA9,0XF7, 0XB6,0XE8,0X0A,0X54,0XD7,0X89,0X6B,0X35, }; /*unsigned char data_crc8(volatile unsigned char *pSource, unsigned char NUM) { unsigned char table_data = 0, CRC_result = 0; for( unsigned char i = 0; i < NUM; i ++ ) { CRC_result ^= *pSource++; table_data = CRC8_TABLE[CRC_result]; CRC_result += table_data; } return CRC_result; }*/ unsigned char data_crc8(volatile unsigned char *pSource, uint16_t NUM) { unsigned char table_data = 0, CRC_result = 0; uint16_t i; for(i = 0; i < NUM; i ++ ) { CRC_result ^= *pSource++; table_data = CRC8_TABLE[CRC_result]; CRC_result += table_data; } return CRC_result; } const uint16_t crc16tab[256] = { 0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241, 0xc601, 0x06c0, 0x0780, 0xc741, 0x0500, 0xc5c1, 0xc481, 0x0440, 0xcc01, 0x0cc0, 0x0d80, 0xcd41, 0x0f00, 0xcfc1, 0xce81, 0x0e40, 0x0a00, 0xcac1, 0xcb81, 0x0b40, 0xc901, 0x09c0, 0x0880, 0xc841, 0xd801, 0x18c0, 0x1980, 0xd941, 0x1b00, 0xdbc1, 0xda81, 0x1a40, 0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01, 0x1dc0, 0x1c80, 0xdc41, 0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, 0x1680, 0xd641, 0xd201, 0x12c0, 0x1380, 0xd341, 0x1100, 0xd1c1, 0xd081, 0x1040, 0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240, 0x3600, 0xf6c1, 0xf781, 0x3740, 0xf501, 0x35c0, 0x3480, 0xf441, 0x3c00, 0xfcc1, 0xfd81, 0x3d40, 0xff01, 0x3fc0, 0x3e80, 0xfe41, 0xfa01, 0x3ac0, 0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840, 0x2800, 0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41, 0xee01, 0x2ec0, 0x2f80, 0xef41, 0x2d00, 0xedc1, 0xec81, 0x2c40, 0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640, 0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041, 0xa001, 0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281, 0x6240, 0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441, 0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41, 0xaa01, 0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840, 0x7800, 0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41, 0xbe01, 0x7ec0, 0x7f80, 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40, 0xb401, 0x74c0, 0x7580, 0xb541, 0x7700, 0xb7c1, 0xb681, 0x7640, 0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041, 0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241, 0x9601, 0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481, 0x5440, 0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40, 0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841, 0x8801, 0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40, 0x4e00, 0x8ec1, 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41, 0x4400, 0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641, 0x8201, 0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040 }; /*输入需校验字符data, lastResult上次crc交验结果 */ uint16_t CRC16(unsigned char data, uint16_t lastResult) { return ((uint16_t)((lastResult >> 8) ^ crc16tab[ (lastResult ^ data) & 0xFF ])); } /*输入字符串pL_string和长度L_LEN lastCRCresult:表示上次字符串校验结果, 如果当前校验是重新开始校验则填0; 如果当前校验是上次校验继续则填入上次校验结果. 返回CRC校验值*/ uint16_t CRC16_data(unsigned char *pL_string, uint16_t L_LEN) { uint16_t result = 0; uint16_t I; for(I = 0; I < L_LEN; I ++ ) { result = CRC16(pL_string[I], result); } return result; }