Bitte Blick auf folgenden Code (CRC16 )

OP #1534742
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
1
uint16_t CalcCRC16(uint8_t *buffer, uint8_t count)
2
{
3
#define POLINOM   0xA001  
4
uint16_t crc;
5
uint8_t ibit;
6
uint16_t i;
7

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

11
for(i=0;i<count;i++)
12
{
13
     crc^=buffer[i];
14
     for(ibit=0;ibit<8;ibit++)
15
     {
16
          if (crc & 0x0001)
17
    {
18
    crc>>=1;
19
    crc^=POLINOM;
20
    }
21
    else
22
    {
23
    crc>>=1;
24
    }
25
      }
26
}
27
return(crc);
28
}

Was mach ich falsch?

Vielen Dank für Eure Hilfe

Gruß
Peter
OP #1535211
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
#1535237
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.
#1535243
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.
#1535264
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.