Forum: Projekte & Code CRC8 und CRC32 in C


von Harry M. (harry4516)


Angehängte Dateien:

Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Paula (Gast)


Lesenswert?

Danke, sehr hilfreich!!!

von Wehe (Gast)


Lesenswert?

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ß

von Le (Gast)


Angehängte Dateien:

Lesenswert?

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 ?

von Le (Gast)


Lesenswert?

Ich habe nochmals die Eingaben überprüft. Ich komme nicht auf die 
gewünschte CRC Summe von 0xCBF43926.

von Detlef _. (detlef_a)


Lesenswert?

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
Noch kein Account? Hier anmelden.