Forum: PC-Programmierung Problem mit CRC-8 Berechnung


von Macki (Gast)


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

von Timmo H. (masterfx)


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.

von Macki (Gast)


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 ;-).

von Timmo H. (masterfx)


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.

von Macki (Gast)


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

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.