Función para calcular una suma de comprobación CRC16

Estoy trabajando en una biblioteca para proporcionar una comunicación simple y confiable a través de una conexión RS232 o RS485. Parte de este código implica el uso de una suma de comprobación CRC16 en los datos para detectar la corrupción del ruido de la línea. He creado una función para calcular una suma de comprobación CRC16, pero no parece estar emitiendo los valores correctos.

El código relevante que he escrito está abajo (también se puede encontraraquí).

<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>

Estoy comprobando mi salida contraesta calculadora CRC en línea.

Llegué a la conclusión de que mi comprensión de cómo calcular un CRC16 es errónea o la calculadora en línea es incorrecta (la primera parece más probable). ¿Alguien puede decirme dónde podría estar yendo mal?

Respuestas a la pregunta(6)

Su respuesta a la pregunta