Я работаю над библиотекой, обеспечивающей простую и надежную связь через соединение RS232 или RS485. Часть этого кода включает использование контрольной суммы CRC16 для данных для обнаружения искажений из-за линейного шума. Я создал функцию для вычисления контрольной суммы CRC16, но, похоже, она не выводит правильные значения.
Соответствующий код, который я написал, приведен ниже (его также можно найти здесь).
#include
#define CRC16 0x8005
uint16_t gen_crc16(const uint8_t *data, uint16_t size)
{
uint16_t out = 0;
int bits_read = 0, bit_flag;
/* Sanity check: */
if(data == NULL)
return 0;
while(size > 0)
{
bit_flag = out >> 15;
/* Get next bit: */
out <<= 1;
out |= (*data >> (7 - bits_read)) & 1;
/* Increment bit counter: */
bits_read++;
if(bits_read > 7)
{
bits_read = 0;
data++;
size--;
}
/* Cycle check: */
if(bit_flag)
out ^= CRC16;
}
return out;
}
Я сверяю результат с этим онлайн-калькулятором CRC.
Я пришел к выводу, что либо мое понимание того, как вычислить CRC16, неверно, либо онлайн-калькулятор неверен (первое кажется более вероятным). Может ли кто-нибудь сказать мне, где я мог ошибиться?