Hallo zusammen, ich habe hier den untenstehenden Code gefunden zur Berechnung einer Checksumme (CRC-16), allerdings bekomme ich in den beiden Bytes des Ergebnisses jeweils nur eine "1". Was mache ich falsch? Wenn ich aus 3 Bytes einen CRC-Wert ermitteln möchte, muss ich die Funktion doch einfach nur 3x aufrufen: DEVICE_CRC16 = calcCRC16r (DEVICE_CRC16,Wert1,0xA001); DEVICE_CRC16 = calcCRC16r (DEVICE_CRC16,Wert2,0xA001); DEVICE_CRC16 = calcCRC16r (DEVICE_CRC16,Wert3,0xA001); Die beiden Bytes frage ich mit DEVICE_CRC16.low8 bzw. DEVICE_CRC16.high8 ab. Bei den Deklarationen von Wert1-3 habe ich bereits alles probiert (uns16/ uns8, char) - am Ergebnis hat es nichts geändert. Außerdem glaube ich nicht dass das Polynom A001 (bzw. "1010000000000001") dem Polynom von CRC16 entspricht... Kennt sich hier jemand gut aus? Grüße Olaf //- calcCRC16r ------------------------------------------------------ unsigned int calcCRC16r(unsigned int crc, unsigned int c, unsigned int mask) { unsigned char i; for(i=0;i<8;i++) { if((crc ^ c) & 1) { crc=(crc>>1)^mask; } else crc>>=1; c>>=1; } return (crc); } //------------------------------------------------------------------- Aufruf der Funktion im Programm: { //... unsigned int DEVICE_CRC16=0; DEVICE_CRC16 = calcCRC16r (DEVICE_CRC16,chr,0xA001); //... }
Ja. Mein code : PROCEDURE calcCRCbyte(data:BYTE;VAR crc:WORD); VAR i:BYTE; BEGIN FOR i:=0 TO 7 DO BEGIN IF ((data and $01)XOR(crc AND $0001)<>0) THEN BEGIN crc:=crc shr 1; crc:= crc XOR $A001; END ELSE BEGIN crc:=crc shr 1; END; data:=data shr 1; END; END; Deiner scheint etwas kuerzer zu sein, dh etwas wegzulassen.
Hier einer in C: HEADER:
1 | /*****************************************************************************
|
2 | * Name: crcCCITT()
|
3 | * Eingaben: - Laenge der Nachricht
|
4 | * - Zeiger auf die Nachricht
|
5 | * - CRC-Vorladewert, Startwert ist 0xFFFF
|
6 | * Ausgaben: - CRC von der Nachricht
|
7 | * Beschreibung: Die Funktion berechnet den CRC von der Nachricht nach dem
|
8 | * Generatorpolynom g(x) = x^16+ x^12 + x^5 + 1 (CCITT-Polynom).
|
9 | *****************************************************************************/
|
10 | |
11 | #ifndef __CRC16_H__
|
12 | #define __CRC16_H__
|
13 | |
14 | #include <inttypes.h> |
15 | |
16 | #define poly 0x1021 // g(x) = (x^16+) x^12 + x^5 + 1
|
17 | |
18 | uint16_t crcCCITT(uint8_t size, volatile uint8_t * mem, uint16_t crc); |
19 | |
20 | #endif
|
IMPLEMENTATION:
1 | uint16_t crcCCITT(uint8_t size, volatile uint8_t * mem, uint16_t crc) |
2 | {
|
3 | // static int i,j;
|
4 | uint8_t i; |
5 | uint8_t j; |
6 | |
7 | // static unsigned short b;
|
8 | uint8_t b; |
9 | |
10 | // static unsigned char m;
|
11 | uint8_t m; |
12 | |
13 | // While (more message bits)
|
14 | for (i = 0; i < size; i++) |
15 | {
|
16 | m = mem[i]; |
17 | for( j = 8; j; j-- ) |
18 | {
|
19 | b = 0; |
20 | if(crc & 0x8000) |
21 | b++; |
22 | // Shift the register left by one bit,
|
23 | crc <<= 1; |
24 | if ((m & 0x80) != 0) crc |= 1; |
25 | m <<= 1; |
26 | // If (a 1 bit popped out of the register during step 3)
|
27 | // Register = Register XOR Poly.
|
28 | if (b != 0) |
29 | crc ^= poly; |
30 | }
|
31 | }
|
32 | return crc; |
33 | }
|
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.