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


von Pier S. (bigpier)


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
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

von STK500-Besitzer (Gast)


Lesenswert?

>if (count>256) return(0);


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

von Pier S. (bigpier)


Lesenswert?

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


Gruß
Peter

von Pier S. (bigpier)


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

von Thomas K. (muetze1)


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.

von Stefan E. (sternst)


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.

von Pier S. (bigpier)


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

von Karl H. (kbuchegg)


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.

von Pier S. (bigpier)


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

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.