Функция для вычисления контрольной суммы CRC16
Я работаю над библиотекой, чтобы обеспечить простую и надежную связь через соединение RS232 или RS485. Часть этого кода включает использование контрольной суммы CRC16 для данных, чтобы обнаружить искажение из-за шума линии. Я создал функцию для вычисления контрольной суммы CRC16, но, по-видимому, она не выводит правильные значения.
Соответствующий код, который я написал, находится ниже (его также можно найтиВот).
<code>#include <stdint.h> #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; } </code>
Я проверяю свои результаты поэто онлайн калькулятор CRC.
Я пришел к выводу, что либо мое понимание того, как рассчитать CRC16, неверно, либо неправильное использование онлайн-калькулятора (первое кажется более вероятным). Может кто-нибудь сказать мне, где я могу пойти не так?