Unity3D, Port-série, Arduino : comment augmenter la rapidité de transmission.

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.

@+