Forum: Mikrocontroller und Digitale Elektronik CRC Berechnung


von Ralf (Gast)


Lesenswert?

Hallo,

kann mir bitte jemand erklären, wie ein CRC funktioniert?

Offenbar sind meine Stichwörter, mit denen ich GOOGLE gefüttert habe,
falsch gewählt, denn ich habe nichts brauchbares gefunden. Ich suche
eine möglichst einfache Beschreibung zu CRC.

Gruß Ralf

von Johannes M. Richter (Gast)


Lesenswert?


von Ralf (Gast)


Lesenswert?

Okay,

ich hab mir mal die Appnote 27 von Dallas/Maxim durchgelesen und mir
dann eine Routine gebastelt:

uchar CRC_8(uchar DATA, uchar CRC, uchar MASK) {
  uchar i;            //Zähler

  for(i = 8; i; i--) {
    if((CRC & 0x01) ^ (DATA & 0x01)) {
      CRC ^= MASK;
      CRC >>= 1;
      CRC |= 0x80;
    }
    else CRC >>= 1;

    DATA >>= 1;
  }

  return(CRC);
}

Parameter 1 ist das Datenbyte, für das der CRC berechnet werden soll,
Parameter 2 kann einen CRC-Wert eines vorangegangenen Bytes enthalten
(ansonsten 0x00) und Parameter 3 ist die Maske, mit der der CRC
berechnet wird.

Bitte nicht lachen, bin noch C-Anfänger!!!!

Verbesserungsvorschläge sind erwünscht, ansonsten würde ich diesen Code
in den Code-Bereich des Forums posten.

Gruß Ralf

von Jan D. (keyman)


Lesenswert?

Hallo.
Ich muss diesen mehr als alten Post mal ausgraben, weil ich eigentlich 
genau die gleiche frage habe.
und zwar sind alle codebeispiele die ich gefunden habe für bestimmte 
generatorpolynome oder ähnliches gemüntzt.
ich hab aber eine funkübertragung welche crc-geprüft übermittelt wird
(standard sind 5 nutzbyte)
meine CRC vorgabe ist ein generatorwert von 1100 0101 also 0xC5

hat jemand einen c-code welcher das problemlos kann, und das ohne 
vorbelegungen?

grundsätzlich wäre es nötig da auch mehr byte umzusetzen (können auch 
mehr sein).
habe im www leider nur code für crc-16 usw gefunden, und dieser war 
nicht anpassbar, mangels verständnis; oder eben crc-8 code, welcher 
schon firmendefinierte standarts inne hatte (da gibts wohl von 
dallas/maxim ne anwendung, siehe oben).
ich weiß das wurde hier schon viele male besprochen aber ich finde 
einfach absolut nichts passendes...
vielen dank für eure hile!!
MfG
jan

von Alban (Gast)


Lesenswert?

Bei den Links nichts dabei gewesen was dir gefällt?:

http://www.mikrocontroller.net/forum/4?filter=crc*

von Weisnix (Gast)


Lesenswert?

Schon mal bei www.wikipedia.de vorbeigeschaut?

von Uli (Gast)


Lesenswert?

Ein CRC ist ein Polynom ueber ein einen Bitstrom. Mit einem 16bit CRC 
kann man 2^16 bit, oder 8 kByte gegen 1 bit Fehler schuetzen, mit einem 
8 bit CRC kann man 2^8 bit, resp 32 Bytes. Der einfache Ansatz ist ein 
Schieberegister und estwas XOR. Dh der Aufwand ist Schieben und XOR pro 
bit. Der etwas schnellere Ansatz, bedarf einer Tabelle, und kann mit der 
Tabelle zusammen ein Byte aufs Mal machen.

Uli

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.