CRC-Prüfsumme bei konstantem String nicht konstant ??
-
Hallo Leute,
ich bin dabei von einem String der Art "ABC;irgendwas" eine Checksumme zu erstellen.
Das Klappt bisweilen auch ganz gut. Die Generierung der Checksumme erhalte ich durch folgenden Algorithmus:/* Optimized Dallas (now Maxim) iButton 8-bit CRC calculation. Polynomial: x^8 + x^5 + x^4 + 1 (0x8C)<br> Initial value: 0x0 See http://www.maxim-ic.com/appnotes.cfm/appnote_number/27 The following is the equivalent functionality written in C. */ uint8_t _crc_ibutton_update(uint8_t crc, uint8_t data) { uint8_t i; crc = crc ^ data; for (i = 0; i < 8; i++) { if (crc & 0x01) crc = (crc >> 1) ^ 0x8C; else crc >>= 1; } return crc; }Die Funktion wird in meinem Programm folgendermaßen verwendet:
char str[30]; uint8_t crc; strcpy(str, "DAT"); strcat(str, ";"); strcat(str, "0,1223:320"); str[strlen(str)+1]='\0'; Label6->Caption=str; for (uint8_t i=0; i<strlen(str); i++) //erstelle von ABC;XYZ die CRC crc = _crc_ibutton_update(crc, str[i]); Label7->Caption=IntToStr(crc);Wie man sehen kann, ist der String immer der gleiche, nämlich "DAT;0,1223:320".
Daraus erhalte ich die Prüfsumme 233. Mir ist aber aufgefallen, sobald ich die Maus aus dem Programmfenster bewege oder auf den blauen Balken des fensters oben die maus halte und gedrückt lasse, sich die CRC verändert. Womit hat das zu tun? Der String bleibt doch der gleiche, wieso aber nicht die CRC?Viele Grüße,
Simon
-
Gelöst: hab vergessen crc vor dem Aufruf des Alorithmus zu initialisieren. Nach dem verlassen der Funktion war warscheinlich noch irgendein Müll drin...
vG
-
Hast Du einen Code um auf iButtons mit dem CBuilder zuzugreifen? ich hatte das mal versucht aber nicht hinbekommen.
Falls ja, würdest Du ihn mal posten?Gruß myerscola
-
Hi, na klar ist kein Thema:
typedef signed char int8_t; typedef unsigned char uint8_t; typedef short int16_t; typedef unsigned short uint16_t; typedef long int32_t; typedef unsigned long uint32_t; typedef long long int64_t; typedef unsigned long long uint64_t; uint8_t _crc_ibutton_update(uint8_t crc, uint8_t data) { uint8_t i; crc = crc ^ data; for (i = 0; i < 8; i++) { if (crc & 0x01) crc = (crc >> 1) ^ 0x8C; else crc >>= 1; } return crc; }Die Checksumme kannst du aus einem String z.B. so bilden (wie in meinem Beiträgen zuvor):
nt8_t rs232_getcrc(char* inp) { char str[20]; uint8_t crc = 0; strcpy( str, inp ); for ( unsigned int i = 0; i<strlen( str ); i++) //erstelle von inp die CRC crc = _crc_ibutton_update(crc, str[i]); return crc; }Viel Erfolg,
Simon