mikrocontroller.net

Forum: Projekte & Code CRC8 und CRC32 in C


Autor: Harry May (harry4516)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Paula (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, sehr hilfreich!!!

Autor: Wehe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Le (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi, ich habe mal den CRC32 C-Code getestet.
// ProjektCRC32.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//

#include "stdafx.h"
#include <stdio.h>

unsigned long reg32 = 0xffffffff;     // Schieberegister
 
unsigned long crc32_bytecalc(unsigned char byte)
{
  int i;
  unsigned long polynom = 0xEDB88320;    // Generatorpolynom

    for (i=0; i<8; ++i)
  {
        if ((reg32&1) != (byte&1))
             reg32 = (reg32>>1)^polynom; 
        else 
             reg32 >>= 1;
    byte >>= 1;
  }
  return reg32 ^ 0xffffffff;       // inverses Ergebnis, MSB zuerst
}

unsigned long crc32_messagecalc(unsigned char *data, int len)
{
  int i;

  for(i=0; i<len; i++) 
  {
    crc32_bytecalc(data[i]);    // Berechne fuer jeweils 8 Bit der Nachricht
  }
  return reg32 ^ 0xffffffff;
}

int _tmain(int argc, _TCHAR* argv[])
{  
  unsigned char data1[] = {"123456789"};
  unsigned long crc32;

  reg32 = 0xffffffff;          // Initialisiere Shift-Register mit Startwert
  crc32 = crc32_messagecalc(data1,9);
  printf("1: CRC32 = %lx\n",crc32);

  unsigned char data2[] = {"123456789"};

  reg32 = 0xffffffff;          // Initialisiere Shift-Register mit Startwert
  crc32 = crc32_messagecalc(data2,9);
  printf("2: CRC32 = %lx\n",crc32);
  
  return 0;
}

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 ?

Autor: Le (Gast)
Datum:

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

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Yo, die Fehlermöglichkeiten sind da mannigfaltig.

So gehts aber:

Beitrag "Yet another CRC32 Code"

Cheers
Detlef

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.