Функция для вычисления контрольной суммы 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, неверно, либо неправильное использование онлайн-калькулятора (первое кажется более вероятным). Может кто-нибудь сказать мне, где я могу пойти не так?

Ответы на вопрос(6)

Ваш ответ на вопрос