www.mikrocontroller.net

Forum: PC-Programmierung Problem mit CRC-8 Berechnung


Autor: Macki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe ein kleines Problem bei der Berechnung eines CRC-8 Wertes und 
würde mich freuen, wenn mir da von euch jemand weiterhelfen könnte. 
Folgendes Problem:

Ich habe eine kleine Elektronik, welche Telemtriedaten über die serielle 
Schnittstelle sendet. Das Telemtriepaket besteht aus einer gewissen 
Anzahl an Bytes gefolgt von einem Byte für den CRC Wert. Laut 
Dokumentation lautet das verwendete Polynom X8 + X5 + X4 + 1 (also 
Dallas/Maxim Typ). Initialwert für den CRC soll 0xde sein. Hier ein 
Beispiel-Packet, wie ich es über die Schnittstelle empfange:

0xc0 0x81 0x05 0x02 0x02 0x00 0xda

Der CRC-Wert ist hier also 0xda. Ich verwende zur Berechnung des CRCs 
eine Lookup-Table. Der C#-Code sieht dann folgendermaßen aus:

byte[] table = {0x00, 0x5e, 0xbc, 0xe2, 0x61, 0x3f, 0xdd, 0x83,
0xc2, 0x9c, 0x7e, 0x20, 0xa3, 0xfd, 0x1f, 0x41,
0x9d, 0xc3, 0x21, 0x7f, 0xfc, 0xa2, 0x40, 0x1e,
0x5f, 0x01, 0xe3, 0xbd, 0x3e, 0x60, 0x82, 0xdc,
0x23, 0x7d, 0x9f, 0xc1, 0x42, 0x1c, 0xfe, 0xa0,
0xe1, 0xbf, 0x5d, 0x03, 0x80, 0xde, 0x3c, 0x62,
0xbe, 0xe0, 0x02, 0x5c, 0xdf, 0x81, 0x63, 0x3d,
0x7c, 0x22, 0xc0, 0x9e, 0x1d, 0x43, 0xa1, 0xff,
0x46, 0x18, 0xfa, 0xa4, 0x27, 0x79, 0x9b, 0xc5,
0x84, 0xda, 0x38, 0x66, 0xe5, 0xbb, 0x59, 0x07,
0xdb, 0x85, 0x67, 0x39, 0xba, 0xe4, 0x06, 0x58,
0x19, 0x47, 0xa5, 0xfb, 0x78, 0x26, 0xc4, 0x9a,
0x65, 0x3b, 0xd9, 0x87, 0x04, 0x5a, 0xb8, 0xe6,
0xa7, 0xf9, 0x1b, 0x45, 0xc6, 0x98, 0x7a, 0x24,
0xf8, 0xa6, 0x44, 0x1a, 0x99, 0xc7, 0x25, 0x7b,
0x3a, 0x64, 0x86, 0xd8, 0x5b, 0x05, 0xe7, 0xb9,
0x8c, 0xd2, 0x30, 0x6e, 0xed, 0xb3, 0x51, 0x0f,
0x4e, 0x10, 0xf2, 0xac, 0x2f, 0x71, 0x93, 0xcd,
0x11, 0x4f, 0xad, 0xf3, 0x70, 0x2e, 0xcc, 0x92,
0xd3, 0x8d, 0x6f, 0x31, 0xb2, 0xec, 0x0e, 0x50,
0xaf, 0xf1, 0x13, 0x4d, 0xce, 0x90, 0x72, 0x2c,
0x6d, 0x33, 0xd1, 0x8f, 0x0c, 0x52, 0xb0, 0xee,
0x32, 0x6c, 0x8e, 0xd0, 0x53, 0x0d, 0xef, 0xb1,
0xf0, 0xae, 0x4c, 0x12, 0x91, 0xcf, 0x2d, 0x73,
0xca, 0x94, 0x76, 0x28, 0xab, 0xf5, 0x17, 0x49,
0x08, 0x56, 0xb4, 0xea, 0x69, 0x37, 0xd5, 0x8b,
0x57, 0x09, 0xeb, 0xb5, 0x36, 0x68, 0x8a, 0xd4,
0x95, 0xcb, 0x29, 0x77, 0xf4, 0xaa, 0x48, 0x16,
0xe9, 0xb7, 0x55, 0x0b, 0x88, 0xd6, 0x34, 0x6a,
0x2b, 0x75, 0x97, 0xc9, 0x4a, 0x14, 0xf6, 0xa8,
0x74, 0x2a, 0xc8, 0x96, 0x15, 0x4b, 0xa9, 0xf7,
0xb6, 0xe8, 0x0a, 0x54, 0xd7, 0x89, 0x6b, 0x35,
};

        public byte Checksum(params byte[] val)
        {
            if (val == null)
                throw new ArgumentNullException("val");

            byte c = 0xde;

            foreach (byte b in val)
            {
                c = table[c ^ b];
            }

            return c;
        }

Ich komme jedoch nicht auf den Wert 0xda. Ich habe auch schon die 
Bytereihenfolge umgekehrt und CRC-Rechner aus dem Netz benutzt, kann 
aber den Wert, den ich von der Elektronik bekomme nicht reproduzieren. 
Das gleiche gilt für andere Datenpackete mit unterschiedlichen CRC 
Werten.

Hat jemand eine Idee, was ich hier falsch mache?

Schonmal besten Dank und schönen Gruß

Macki

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit einem Init von 0xF2 würde es in diesem Fall passen.
Ansonsten sie die Routine richtig aus, zumindest funktioniert die so bei 
meinem 1-Wire.

Autor: Macki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timmo H. schrieb:
> Mit einem Init von 0xF2 würde es in diesem Fall passen.

Bei mir auch - besten Dank für deine Hilfe! So funktioniert es auch bei 
anderen empfangenen Paketen.

Die Dokumentation von dem Teil kann man echt in die Tonne kloppen - war 
nicht der erste Fehler der mir da das Leben schwer gemacht hat ;-).

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehste, es geht doch  nichts über Trial and Error :-), hab einfach eine 
Endlosschleife gemacht in der ich den Init-wert immer um eins 
inkrementiert habe und bei dem Ergebnis von 0xDA durch die CRC8-Routine 
habe ich mir den dazugehörigen Initwert ausgeben lassen.
Du könntest natürlich nochmal prüfen ob du vielleicht einmal zu wenig 
geshiftet hast oder MSB und LSB vertausch etc. Aber wenn die Werte im 
Datenpaket vertrauenserweckend sind, dann passt es ja.

Autor: Macki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also die anderen Werte im Datenpaket sind 100%ig richtig und die LUT 
müsste auch richtig sein - insofern sollte das so passen.

Nochmal besten Dank und schönen Gruß

Macki

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.