Funkcja obliczania sumy kontrolnej CRC16

Pracuję nad biblioteką, aby zapewnić prostą niezawodną komunikację przez połączenie RS232 lub RS485. Część tego kodu polega na użyciu sumy kontrolnej CRC16 na danych do wykrywania uszkodzeń spowodowanych szumem linii. Stworzyłem funkcję do obliczania sumy kontrolnej CRC16, ale wydaje się, że nie generuje poprawnych wartości.

Odpowiedni kod, który napisałem, znajduje się poniżej (można go również znaleźćtutaj).

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

Sprawdzam moje dane wyjścioweten internetowy kalkulator CRC.

Doszedłem do wniosku, że albo moje zrozumienie sposobu obliczania CRC16 jest błędne, albo kalkulator internetowy jest błędny (pierwszy wydaje się bardziej prawdopodobny). Czy ktoś może mi powiedzieć, gdzie mogę pójść źle?

questionAnswers(6)

yourAnswerToTheQuestion