unsigned short crc2(unsigned short crc, unsigned char data) { unsigned char i, x16, carry; for (i = 0; i < 8; i++) { x16 = (data ^ crc) & 1; data >>= 1; if (x16 == 1) { crc ^= 0x4002; carry = 1; } else carry = 0; crc >>= 1; if (carry) crc |= 0x8000; else crc &= 0x7fff; } return crc; }