www.mikrocontroller.net

Forum: Compiler & IDEs Bitte Blick auf folgenden Code (CRC16 )


Autor: Pier S. (bigpier)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
zuerst mal Frohe Weihnachten!
Ich wende mich wieder mal mit einem kleinen Problem an Euch.
Ich habe hier im Forum gelesen das wenn man eine CRC Prüfsumme erstellt 
und diese normal an den Daten anhängt und danach auf der Gegenstelle 
nochmals eine CRC Prüfsumme erstellt inklusive der errechneten Prüfsumme 
sollte bei richtiger Übertragung 0 raus kommen. Stimmt das?
Ich verwende Folgenden Code
uint16_t CalcCRC16(uint8_t *buffer, uint8_t count)
{
#define POLINOM   0xA001  
uint16_t crc;
uint8_t ibit;
uint16_t i;

crc=0;  //0xFFFF;
if (count>256) return(0);

for(i=0;i<count;i++)
{
     crc^=buffer[i];
     for(ibit=0;ibit<8;ibit++)
     {
          if (crc & 0x0001)
    {
    crc>>=1;
    crc^=POLINOM;
    }
    else
    {
    crc>>=1;
    }
      }
}
return(crc);
}

Was mach ich falsch?

Vielen Dank für Eure Hilfe

Gruß
Peter

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>if (count>256) return(0);


Count kann nie größer als 255 werden...

Autor: Pier S. (bigpier)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja OK das weiß ich.
Giebt es sonnst noch was was Dir auffällt !


Gruß
Peter

Autor: Pier S. (bigpier)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht hab ich mich nicht richtig ausgedrückt, wenn ich mit meinem 
Code die Prüfung inklusive der 2 Byte CRC mache kommt nict null raus.
Nochmals die Frage hab ich was falsch verstanden ?
Ist meine CRC überhaupt richtig ?

Wäre für jeden Kommentar froh.

Vielen Dank
Peter

Autor: Thomas K. (muetze1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pier S. schrieb:
> Vielleicht hab ich mich nicht richtig ausgedrückt, wenn ich mit meinem
> Code die Prüfung inklusive der 2 Byte CRC mache kommt nict null raus.

Dies ist ein normaler CRC16 Code, keiner der auf 0 bestimmt wird. Von 
daher muss der Empfänger den Code genauso nur über die Daten laufen 
lassen (exklusive der CRC16). Danach sollte er den gleichen CRC16 Wert 
erhalten wie er auch nach den Daten steht. Ist dies nicht der Fall, dann 
sind die Daten oder die CRC falsch übertragen worden, ergo neu 
übermitteln.

Das bei allen möglichen CRC Berechnungen nach erneuter Berechnung 
inklusive der zuvor ermittelten CRC 0 rauskommt ist mehr als 
unwahrscheinlich und keine gängige Methode bei CRC Berechnungen.

Quersummen und Aufsummierungen sind meist so ausgelegt, dass die 
errechnete Prüfsumme so umgewandelt wird, dass sie beim Empfänger 
zusammen mit den Daten genau einen spezifizierten Wert ergibt (z.B. 0, 
0xaa, 0xff, o.ä.). Das ist aber ein grundlegend anderer Ansatz als die 
CRC Berechnung nach dem obigen System.

Ergo: ja, du hast da was durch einander gebracht bzw. falsch verstanden.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas K. schrieb:

> Das bei allen möglichen CRC Berechnungen nach erneuter Berechnung
> inklusive der zuvor ermittelten CRC 0 rauskommt ist mehr als
> unwahrscheinlich und keine gängige Methode bei CRC Berechnungen.

Falsch. Genau das ist eine (wenn nicht "die") zentrale Eigenschaft von 
CRCs.

Autor: Pier S. (bigpier)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok wenigstens ist der Code richtig so.

Jedoch schreibt Peter Dannegger in diesem Trend 
Beitrag "CRC-16 Prüfsumme (serielle Übertragung)"

D.h. beim Erzeugen der CRC schreibt man einfach die CRC in die letzen
beiden Bytes.

Und beim Prüfem macht man die CRC über den kompletten Datensatz und
prüft dann auf 0.

Was ist damit gemeint?

Vielen Dank FÜR Eure Hilfe

Peter

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pier S. schrieb:

> D.h. beim Erzeugen der CRC schreibt man einfach die CRC in die letzen
> beiden Bytes.
>
> Und beim Prüfem macht man die CRC über den kompletten Datensatz und
> prüft dann auf 0.
>
> Was ist damit gemeint?

Genau das was da steht (und wie du es anscheinend auch verstanden hast):
Der Empfänger macht eine CRC Berechnung über den kompletten empfangenen 
Datensatz (inklusive der vom Sender berechneten CRC) und dann kommt da 0 
raus.

In welcher Reihenfolge hast du denn die beiden Bytes deiner CRC 
Berechnung in die Daten eingefügt? Dreh die Reiehnfolge einmal um und 
sieh nach obs dann stimmt.

Autor: Pier S. (bigpier)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger dein Tip war Goldwert  jetzt läuft es so wie ich es 
mir gedacht habe!
Vielen vielen Dank für Deine Kompetente Hilfe

Allen einen guten rutsch und ein erfolgreiches neues Jahr

Gruß
Peter

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.