Funktion zum Berechnen einer CRC16-Prüfsumme

Dem ich arbeite, eine Bibliothek zu bieten einfache, zuverlässige Kommunikation über eine RS232-oder RS485-Verbindung. Ein Teil dieser code beinhaltet die Verwendung einer CRC16-Prüfsumme für die Daten zur Aufdeckung von Korruption von der Linie Lärm. Ich habe eine Funktion zum berechnen einer Prüfsumme CRC16, aber es scheint nicht zu sein, die richtigen Werte ausgeben.

Den relevanten code, den ich geschrieben habe, ist unten (es können auch gefunden werden hier).

#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;
}

Bin ich die überprüfung meiner Ausgabe gegen diese online-CRC-Rechner.

Ich bin zu dem Schluss gekommen, dass entweder mein Verständnis davon, wie die Berechnung einer CRC16 falsch ist, oder der online-Rechner falsch ist (ersteres wohl wahrscheinlicher ist). Kann mir jemand sagen, wo ich vielleicht falsch läuft?

InformationsquelleAutor der Frage Jonathan Lamothe | 2012-05-12

Schreibe einen Kommentar