hallo, ich bin auf einer code gestoßen und möchte gerne wissen, was der code (funktion) macht: _applid ist ein fixen Wert= 3660 (CRC-ID), was bedeutet dieser Wert? Argument _data[] enthält byte(0 bis 7) wobei byte(0) ist die CRC-Wert (gesendet), alle andere Argumente haben ein Wert Null. wie wird hier der Rest gebildet? danke im Voraus! Max hier die Funktion: int calcCRC8 (int _offset, int _applid, int _length, byte _data[], int _CRCoffset) { int crc_ist = 0; int i; // CRC Lookup-table int K_CRC_TABLE_CRC8[256] = { 0x00, 0x1d, 0x3a, 0x27, 0x74, 0x69, 0x4e, 0x53, 0xe8, 0xf5, 0xd2, 0xcf, 0x9c, 0x81, 0xa6, 0xbb, 0xcd, 0xd0, 0xf7, 0xea, 0xb9, 0xa4, 0x83, 0x9e, 0x25, 0x38, 0x1f, 0x02, 0x51, 0x4c, 0x6b, 0x76, 0x87, 0x9a, 0xbd, 0xa0, 0xf3, 0xee, 0xc9, 0xd4, 0x6f, 0x72, 0x55, 0x48, 0x1b, 0x06, 0x21, 0x3c, 0x4a, 0x57, 0x70, 0x6d, 0x3e, 0x23, 0x04, 0x19, 0xa2, 0xbf, 0x98, 0x85, 0xd6, 0xcb, 0xec, 0xf1, 0x13, 0x0e, 0x29, 0x34, 0x67, 0x7a, 0x5d, 0x40, 0xfb, 0xe6, 0xc1, 0xdc, 0x8f, 0x92, 0xb5, 0xa8, 0xde, 0xc3, 0xe4, 0xf9, 0xaa, 0xb7, 0x90, 0x8d, 0x36, 0x2b, 0x0c, 0x11, 0x42, 0x5f, 0x78, 0x65, 0x94, 0x89, 0xae, 0xb3, 0xe0, 0xfd, 0xda, 0xc7, 0x7c, 0x61, 0x46, 0x5b, 0x08, 0x15, 0x32, 0x2f, 0x59, 0x44, 0x63, 0x7e, 0x2d, 0x30, 0x17, 0x0a, 0xb1, 0xac, 0x8b, 0x96, 0xc5, 0xd8, 0xff, 0xe2, 0x26, 0x3b, 0x1c, 0x01, 0x52, 0x4f, 0x68, 0x75, 0xce, 0xd3, 0xf4, 0xe9, 0xba, 0xa7, 0x80, 0x9d, 0xeb, 0xf6, 0xd1, 0xcc, 0x9f, 0x82, 0xa5, 0xb8, 0x03, 0x1e, 0x39, 0x24, 0x77, 0x6a, 0x4d, 0x50, 0xa1, 0xbc, 0x9b, 0x86, 0xd5, 0xc8, 0xef, 0xf2, 0x49, 0x54, 0x73, 0x6e, 0x3d, 0x20, 0x07, 0x1a, 0x6c, 0x71, 0x56, 0x4b, 0x18, 0x05, 0x22, 0x3f, 0x84, 0x99, 0xbe, 0xa3, 0xf0, 0xed, 0xca, 0xd7, 0x35, 0x28, 0x0f, 0x12, 0x41, 0x5c, 0x7b, 0x66, 0xdd, 0xc0, 0xe7, 0xfa, 0xa9, 0xb4, 0x93, 0x8e, 0xf8, 0xe5, 0xc2, 0xdf, 0x8c, 0x91, 0xb6, 0xab, 0x10, 0x0d, 0x2a, 0x37, 0x64, 0x79, 0x5e, 0x43, 0xb2, 0xaf, 0x88, 0x95, 0xc6, 0xdb, 0xfc, 0xe1, 0x5a, 0x47, 0x60, 0x7d, 0x2e, 0x33, 0x14, 0x09, 0x7f, 0x62, 0x45, 0x58, 0x0b, 0x16, 0x31, 0x2c, 0x97, 0x8a, 0xad, 0xb0, 0xe3, 0xfe, 0xd9, 0xc4 }; // Berechne CRC Low-Byte von Application-ID crc_ist = K_CRC_TABLE_CRC8[(_applid & 0x00ff)]; // Berechne CRC High-Byte von Application-ID _applid = (_applid & 0x00ff); // wegen M10 verfahren muss das untere nibble der CRC-ID (0xFFF) auf CRC-ID (0xFF) geschnitten werden. crc_ist = K_CRC_TABLE_CRC8[crc_ist^(_applid >> 8)]; // Berechne CRC vom Datenbereich if (_CRCoffset>0) { for(i = 0; i < _length - 1; i++) { crc_ist = K_CRC_TABLE_CRC8[crc_ist^_data[i + _offset]]; } } else { for(i = 1; i < _length; i++) { crc_ist = K_CRC_TABLE_CRC8[crc_ist^_data[i + _offset]]; } } return crc_ist; }
:
Verschoben durch User
Erstmal grundlegend, was eine CRC macht: http://www.mikrocontroller.net/articles/CRC Die naive Realisierung bräuchte einen Schleifendurchlauf pro Bit (nicht Byte) der Eingangsdaten. Das kann man beschleunigen, wenn man eine Lookuptabelle nimmt. In diesem Fall werden immer 4 Bit auf einmal gerechnet, dafür braucht man 256 Byte an Tabellenplatz im ROM. Man kann auch ein ganzes Byte auf einmal rechnen, braucht dann aber 2kByte im ROM, weil die Tabelle größer ist. appl_id ist eine Konstante, die in die CRC zusätzlich zu den Daten einfließt. Sowas kann man z.B. nutzen, wenn man Konfigurationsdaten oder so hat, deren Format sich aber mit einer neuen Version der Software-Anwendung ändern könnte. Damit die neue Software dann nicht Konfigdaten im alten Format einliest und sich verschluckt, kann man eine Versionierung des Formats einführen.
Hallo,
erstmal danke für den Antwort,
>>appl_id ist eine Konstante, die in die CRC zusätzlich zu den Daten
einfließt.
wie wird diese konstante berechnet, ich habe festgestellt dass dies von
Sender zu Sender unterschiedlich ist! ist das nicht der Polynom selber?
Grüße
MAX
frage noch... in der For-Schleife: for(i = 1; i < _length; i++) { crc_ist = K_CRC_TABLE_CRC8[crc_ist^_data[i + _offset]]; } } wird immer mit dem letzten Data_Byte berechnet, _length = dlc des CANs, ist 8 in dieser Fall, loop ist hier unnötig man kann auch return K_CRC_TABLE_CRC8[crc_ist^_data[7 + _offset]] ausgeben!!?? Grüße Max
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.