www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Wie funktioniert der CRC-check gegen 0


Autor: Davos Rit (richmand)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi. Ich habe folgendes Problem. Und zwar möchte ich zur Datensicherheit 
innerhalb eines CAN-Netzwerkes eine zusätzliche CRC einfügen. Zur 
Generierung der CRC verwende ich folgenden Algorithmus:

static uint16 get_crc(uint8 *bufp, uint32 buflen, uint32 polynom)
{
    uint32 crc;
    int n;


    crc = 0;
    for ( ; buflen > 0; buflen--, bufp++)
    {
        crc += (uint32)(*bufp << 16);

        for (n=0; n<8; n++)
        {
            if (crc & 0x00000001)
            {
                crc ^= polynom;
            }
            crc >>= 1;
        }
    }
    return ((uint16)crc);
}

Wie kann ich denn jetzt, quasi am anderen Ende, testen, ob die CRC 
richtig ist. Gibt es da nicht einen Test gegen 0, bei dem mit Sicherheit 
gewährleistet ist, dass die übertragenen Daten konsitent sind? Irgendwie 
blick ich bei dem CRC generieren nicht so richtig durch.

MfG

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst die CRC mitsenden, und der Empfänger vergleicht dann die CRCs 
(die Mitgesendete mit der selbst Berechneten).

Autor: Davos Rit (richmand)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also berechnet der Empfänger ebenfalls eine CRC und zieht dann die 
empfangene davon ab und bei einem Ergebnis von 0 stimmen beide überein?

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Davos Rit schrieb:
> Also berechnet der Empfänger ebenfalls eine CRC und zieht dann die
> empfangene davon ab und bei einem Ergebnis von 0 stimmen beide überein?

Du brauchst nichts abziehen.
Der CRC ist so konstruiert, dass der Empfänger ebenfalls seine CRC 
mitrechnet. Soweit stimmt es noch. Aber wenn er dann das CRC Byte 
empfängt und dieses CRC Byte in seine eigene Berechnung noch mit 
einfliessen lässt, dann kommt 0 raus.

Du schiebst einfach nur das Datenpaket (inklusive der gesendeten CRC) im 
Empfänger durch den CRC Algorithmus durch und das Ergebnis davon muss 0 
sein.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.