Comme promis, une implémentation de CRC16 légère.
Ce genre de chose tourne sur des projets à vase de processeurs MSP430 bien moins puissants qu'un ATMEGA.
#define update_crc(crc, c) crc = (crc >> 4) ^ crctbl[(c ^ crc) & 0x0F]; \
crc = (crc >> 4) ^ crctbl[((c >> 4) ^ crc) & 0x0F];
static const uint16_t crctbl[] =
{
0x0000, 0x1081, 0x2102, 0x3183,
0x4204, 0x5285, 0x6306, 0x7387,
0x8408, 0x9489, 0xA50A, 0xB58B,
0xC60C, 0xD68D, 0xE70E, 0xF78F
};
// utilisation :
uint16_t crc;
update_crc(crc, c); // étant le caractère à émettre ou reçu
// émission du CRC
// send est la fonction d'émission, à remplacer par la votre
send((crc & 0xFF00) >> 8); // MSB
send(crc & 0x00FF); // LSB
// réception du CRC
// c est le caractère reçu. il y en a deux donc
uint16_t crc;
// 1er caractère du CRC
crc = ((uint16_t)c << 8) & 0xFF00; // MSB
// 2ème caractère du CRC
crc |= (uint16_t)c & 0x00FF; // LSB
En espérant que cela soit suffisamment clair.
@+