weil hier alle paar Wochen ein Hilferuf nach CRC Berechnung gepostet wird, habe ich mal meine erprobten CRC Routinen zu einem lauffähigen Testprogramm zusammengefasst. Hier der CRC8 und der CRC32 (kompatibel zum Ethernet CRC32) in C. Der CRC8 eignet sich für kurze Datensätze die selten gesendet werden, wie z.B. kurze Fernsteuerkommandos, Fernthermometer oder ähnliches. Für Daten die mit größerer Geschwindigkeit übertragen werden, ist der CRC32 besser. Die Programme sind simpel, nicht optimiert, aber für uC Anwendungen an der seriellen Schnittstelle mehr als schnell genug. Bei mir laufen sie auf Atmel uCs. Die angehängten Programme können so wie sie sind compiliert und in einer Konsole ausgeführt werden. Man kann den Code direkt in eine eigene Applikation übernehmen, main() läßt man natürlich weg, aber in main() kann man nachsehen wie die CRC Berechnung aufgerufen wird. Vielleicht will jemand noch seinen CRC16 Code hier posten ? Dann hätten wir alles komplett. viele Grüße Kurt
Harry May schrieb: > Vielleicht will jemand noch seinen CRC16 Code hier posten ? Dann hätten > wir alles komplett. Wozu? Einfach im AVR-GCC die crc16.h öffnen, da sind 3 verschiedene drin. Und auch die crc8 für Maxim 1-wire. Peter
Hi, ich benutze Cosmic-Compiler, und meine frage lautet ob die gepostete Quellcode "CRC8_v2.c" benutzen kann ohne es zu ändern.Im Doc. von Cosmic-Compiler steht es schon funktionen "_checksum8()". "_checksum16()","_checksumx()"..usw. aber die Beispiele sind dann dort von einem Linker Beispiele, die ich nicht verstehe. ich wäre Dankbar für jeden Tip. Gruß
Hi, ich habe mal den CRC32 C-Code getestet.
1 | // ProjektCRC32.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
|
2 | //
|
3 | |
4 | #include "stdafx.h" |
5 | #include <stdio.h> |
6 | |
7 | unsigned long reg32 = 0xffffffff; // Schieberegister |
8 | |
9 | unsigned long crc32_bytecalc(unsigned char byte) |
10 | {
|
11 | int i; |
12 | unsigned long polynom = 0xEDB88320; // Generatorpolynom |
13 | |
14 | for (i=0; i<8; ++i) |
15 | {
|
16 | if ((reg32&1) != (byte&1)) |
17 | reg32 = (reg32>>1)^polynom; |
18 | else
|
19 | reg32 >>= 1; |
20 | byte >>= 1; |
21 | }
|
22 | return reg32 ^ 0xffffffff; // inverses Ergebnis, MSB zuerst |
23 | }
|
24 | |
25 | unsigned long crc32_messagecalc(unsigned char *data, int len) |
26 | {
|
27 | int i; |
28 | |
29 | for(i=0; i<len; i++) |
30 | {
|
31 | crc32_bytecalc(data[i]); // Berechne fuer jeweils 8 Bit der Nachricht |
32 | }
|
33 | return reg32 ^ 0xffffffff; |
34 | }
|
35 | |
36 | int _tmain(int argc, _TCHAR* argv[]) |
37 | {
|
38 | unsigned char data1[] = {"123456789"}; |
39 | unsigned long crc32; |
40 | |
41 | reg32 = 0xffffffff; // Initialisiere Shift-Register mit Startwert |
42 | crc32 = crc32_messagecalc(data1,9); |
43 | printf("1: CRC32 = %lx\n",crc32); |
44 | |
45 | unsigned char data2[] = {"123456789"}; |
46 | |
47 | reg32 = 0xffffffff; // Initialisiere Shift-Register mit Startwert |
48 | crc32 = crc32_messagecalc(data2,9); |
49 | printf("2: CRC32 = %lx\n",crc32); |
50 | |
51 | return 0; |
52 | }
|
Wenn ich nun die Daten auf der Webseite von "http://www.zorc.breitbandkatze.de/crc.html" eingebe, dann komme ich nicht auf das Ergbnis: 0xCBF43926. Was habe ich bei der EIngabe auf der Webseite falsch gemacht ?
Ich habe nochmals die Eingaben überprüft. Ich komme nicht auf die gewünschte CRC Summe von 0xCBF43926.
Yo, die Fehlermöglichkeiten sind da mannigfaltig. So gehts aber: Beitrag "Yet another CRC32 Code" Cheers Detlef
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.