crc16 code
tôi cũng mới nghiên cứu modbus rtu và đã viết xong firmware cho VDK. cách tính crc nhanh nhất đó là tra bảng. Dưới đây là đoạn code tạo ra bảng, và tính crc tôi viết bằng C# cho máy PC.
tôi cũng mới nghiên cứu modbus rtu và đã viết xong firmware cho VDK. cách tính crc nhanh nhất đó là tra bảng. Dưới đây là đoạn code tạo ra bảng, và tính crc tôi viết bằng C# cho máy PC.
Code:
ushort[] crc16_table = new ushort[256] bool is_made_table = false; void make_crc_table() { int c; for (int i = 0; i < 256; i++) { c = i; for (int j = 0; j < 8; j++) { if ((c & 1) == 0) c = c >> 1; else c = 0xa001 ^ (c >> 1); } crc16_table[i] = (ushort)c; } is_made_table = true; } int CRC16(byte[] msg, int count) { if (!is_made_table) make_crc_table(); int crc = 0xffff; for (int i = 0; i < count; i++) { int index = crc ^ msg[i]; // XOR crc with message index = index & 0xff; // keep least significant byte crc = crc >> 8; // get most significant byte of crc crc = crc ^ crc16_table[index]; } return ((crc & 0xFF) << 8) | ((crc >> 8) & 0xFF); //swap crc before return }
Comment