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
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.
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 ;-).
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.