Forum: Mikrocontroller und Digitale Elektronik Ab wann macht CRC8, 16 oder 32 Sinn?


von hardy (Gast)


Lesenswert?

Hallo,

ich möchte ganz gerne eine Übertragung auf der seriellen Schnittstelle 
mit einer Checksumme versehen.

Ab welcher Datenbyte Anzahl macht CRC 16 und CRC 32 Sinn?

Gibt es da eine Orientierung? Bei GPS Datensätze wird ja zum Beispiel 
nur ein normales XOR pro Datenbyte gemacht, das halte ich aber eindeutig 
für anfällig.

Da kann die Checksumme mit 2 Bit Drehern plötzlich wieder stimmen obwohl 
falsche Daten enthalten sind.

:-(

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

hardy schrieb:
> Da kann die Checksumme mit 2 Bit Drehern plötzlich wieder stimmen obwohl
> falsche Daten enthalten sind.
Und wie hoch ist die von dir ermittelte Wahrscheinlichkeit das ein zwei 
(vier, sechs, ...) bit Fehler Auftritt?
Und wieviele musst/willst du den erkennen können? Dann schaust du was 
die CRC leistet und hast deine Antwort.

von Peter D. (peda)


Lesenswert?

Phi * Daumen:
bis 256 Byte: CRC8
bis 64kB: CRC16


Peter

von Bastler (Gast)


Lesenswert?

zwei Bitfehler an exakt derselben Stelle findest du für zu anfällig?

Wie oft trat dieser Fehler bei dir schon auf?

von hardy (Gast)


Lesenswert?

Dank an Euch!

Läubi .. schrieb:
> Und wie hoch ist die von dir ermittelte Wahrscheinlichkeit das ein zwei
> (vier, sechs, ...) bit Fehler Auftritt?
> Und wieviele musst/willst du den erkennen können? Dann schaust du was
> die CRC leistet und hast deine Antwort.

Ich habe keine Ahnung wie ich das ermitteln soll... da reicht mein 
Wissen wohl nicht. Ich habe Datenpakete von max. 127 Datenbytes...

Peter Dannegger schrieb:
> Phi * Daumen:
> bis 256 Byte: CRC8

Das klingt doch gut! Das ist im Prinzip das was ich wissen wollte. Alles 
kostet ja Rechenzeit und Speicherplatz und wenn eine CRC 8 reichen 
würde, dann wäre es doch sehr schön.

Bastler schrieb:
> zwei Bitfehler an exakt derselben Stelle findest du für zu anfällig?
> Wie oft trat dieser Fehler bei dir schon auf?

Keine Ahnung, es ist ja nun nicht so das dann am Controller eine Lampe 
leuchtet. Es wird dann eine Fehlfunktion geben und man wundert rum.
Fand die Anfälligkeit am PC beim erstellen von GPS Datensätze
eben erstaunlich schnell. Zwei Werte verändert und dann kam die gleiche
XOR Summe bei heraus obwohl beide Pakete unterschiedliche Daten 
enthielten.

Das möchte ich durch den Einsatz von CRC vermeiden.

von Bastler (Gast)


Lesenswert?

>und dann kam die gleiche XOR Summe bei heraus obwohl beide Pakete 
>unterschiedliche Daten enthielten.

Das ist ja auch möglich und kein Fehler.
Der Empfänger des Protokolls muss natürlich selbst die CRC berechnen und 
mit der gesendeten vergleichen.

von Karl H. (kbuchegg)


Lesenswert?

hardy schrieb:

> eben erstaunlich schnell. Zwei Werte verändert und dann kam die gleiche
> XOR Summe bei heraus obwohl beide Pakete unterschiedliche Daten
> enthielten.

Gut. Du hast sie mutwillig verändert.
Daher auch die Frage: Wie oft hast du das schon in freier Wildbahn 
beobachtet?

Klar kann es auch mal auf einer Seriellen Störungen geben. Allerdings 
sind diese Fehler normalerweise nicht so subtil, dass zufällig mal 
irgendwo ein Bit kippt. Wenn eine Serielle gestört ist, dann ist sie 
richtig gestört. Da erkennst du deinen GPS Datensatz nicht mehr wieder. 
Da stimmt dann nichts mehr. Keine Datensatzkennung, keine oder viele zu 
viele ',' die die Teile des Datensatzes trennen, kein '\n' oder eines an 
einer völlig falschen Stelle, etc. etc.
Sprich: Wenn man nicht einfach blind in einen GPS Datensatz reingreift 
und sich Zeichen rausholt, dann erkennt man sofort, dass dieser 
Datensatz nichts taugt. Auch völlig ohne Checksumme.

Einen sporadischen Einzelbitfehler hab ich in 30 Jahren auf einer 
Seriellen noch nie erlebt. Komplett gestörte Datensätze ... kommt schon 
mal vor.

von Purzel H. (hacky)


Lesenswert?

>Phi * Daumen:
>bis 256 Byte: CRC8
>bis 64kB: CRC16

Nein. Es sind

CRC8  schuetzt bis 2^8  bit = 32byte
CRC16 schuetzt bis 2^16 bit = 8kbyte
CRC32 schuetzt bis 2^32bit = 500MByte

von hardy (Gast)


Lesenswert?

Bastler schrieb:
> Das ist ja auch möglich und kein Fehler.

Das ist natürlich richtig, doch bin ich der festen Annahme das diese 
Änderung 2 verschiedene CRC Summen erzeugt und damit ein anderen Inhalt 
"anzeigt".

Karl heinz Buchegger schrieb:
> Daher auch die Frage: Wie oft hast du das schon in freier Wildbahn
> beobachtet?

Ganz ehrlich? Noch nie... und es ginge noch weiter, ich habe bis jetzt 
wohl auch noch keine Störung auf den Leitungen erlebt. :-(
Nur weil ich nun von den Prüfsummen gehört habe, würde ich es eben gerne 
doch implementieren um den eventuell Störungsfall einfach auszuschließen 
und im Fall des Falles dann einfach nochmal neu zu senden.

Karl heinz Buchegger schrieb:
> Wenn eine Serielle gestört ist, dann ist sie
> richtig gestört. Da erkennst du deinen GPS Datensatz nicht mehr wieder.

Ok, was sagt dann Deine Erfahrung in Bezug mit Wiederholung bei falscher 
CRC? Macht es dann mit dem Retry überhaupt Sinn? Ohh man, wohl doch 
nicht so trivial wie ich erst dachte.

Heia Jetzt-aber schrieb:
> Nein. Es sind
> CRC8  schuetzt bis 2^8  bit = 32byte

Hmm dann müsste ich wohl doch zu CRC 16 greifen... hmm

Danke Euch!

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

hardy schrieb:
> doch bin ich der festen Annahme
Bei Checksummen ist es wie in der Kryptographie: durch feste Annahmen 
ist noch kein sicheres Verfahren entstanden...

hardy schrieb:
> Nur weil ich nun von den Prüfsummen gehört habe, würde ich es eben gerne
> doch implementieren um den eventuell Störungsfall einfach auszuschließen
Ein XOR ist halt einfach und deckt viele Fälle ab
> und im Fall des Falles dann einfach nochmal neu zu senden.
Wenn der Störungsfall ungleich einem Störfalls (GAU) ist kann man auch 
oft damit leben das (vorübergehend) falsche Werte angezeigt werden, wenn 
diese nicht sowieso wie schon angesprochen durch eine 
Plausibilitätsprüfung verworfen wurden.
Und das Problem ist doch: Wenn die Leitung so "kaputt" ist das gleich 
mehrere Bits umkippen... wie willst du dann die Nachricht, dass neu 
gesendet werden soll darüberkriegen?

von hardy (Gast)


Lesenswert?

Läubi .. schrieb:
> wie willst du dann die Nachricht, dass neu
> gesendet werden soll darüberkriegen?

Jo ja ähm also das weiß ich nun auch noch nicht.

Es geht darum das ich von einem PC zu einer Schaltung übertragen möchte 
und die auch wieder abfragen. Wenn es Störungen gibt dann darf die 
Steuerung keinen Mist machen.

von Spess53 (Gast)


Lesenswert?

Hi

>Es geht darum das ich von einem PC zu einer Schaltung übertragen möchte
>und die auch wieder abfragen. Wenn es Störungen gibt dann darf die
>Steuerung keinen Mist machen.

Dann mach die Verbindung stabil.

MfG Spess

von Bastler (Gast)


Lesenswert?

Denk dir ein Protokoll aus!

Es gibt Protokolle wo Zeichen doppelt versendet werden um sicher zu 
gehen.

Beispiel:
- Jedes Byte mit Parität
- Zeichen wiederholen
- CRC


Aber im Ernst, ich arbeite bei einem Sensorhersteller, da dürfen auch 
keine Fehler vorkommen sonst läuft ne Maschine Amok.
RS232 ist mit dem Pegel schon nicht sooo einfach zu stören, ansonsten 
nimm RS485.
Geschirmte Kabel verwenden, keine extreme Baudraten und ne CRC8 drüber.
Da passiert "normalerweise" nichts.

Wenn die physikalische Anbindung schlecht ist nützt das beste Protokoll 
nichts. Denk auch daran.

von Bastler (Gast)


Lesenswert?

Sorry, vergessen.

Wenn die Anlage sicher sein soll, dann bau eine Art "Keep-Alive" 
Nachricht ein. Wenn die Anlage eine Zeitlang nichts mehr hört geht diese 
in einen sicheren Zustand.

von Hans (Gast)


Lesenswert?

>Gibt es da eine Orientierung? Bei GPS Datensätze wird ja zum Beispiel
>nur ein normales XOR pro Datenbyte gemacht, das halte ich aber eindeutig
>für anfällig.

>Da kann die Checksumme mit 2 Bit Drehern plötzlich wieder stimmen obwohl
>falsche Daten enthalten sind.

Das kommt auf Dein Fehlermodell an. Diese (un-)bewussten
Vertauschungen ("Dreher") kommen i.d.R. bei Menschen vor,
wenn sie etwas niederschreiben muessen, dafuer wurden bestimmte
Pruefsummen entwickelt (z.B. Luhn-Algorithmus).

Bei dem CRC Fehlermodel liegt eine lokale Fehlerannahme zugrunde,
dass ein n-Fehlerbuendel (= n gestoerte Bits) zuschlaegt,
was besonders im Industrieumfeld bei Schaltvorgaengen
(auch bei sonst "ungestoerten" seriellen Leitungen) haeufiger
auftritt ("burst error"). (Auch hier ist das Stichwort RS-485
statt RS-232 schon gefallen.. ;-)

Erstmal:
Wenn das zugrundeliegende Polynom den Grad r hat, wird
jedes Fehlerbuendel der Laenge b <= r sicher (=100%) erkannt.

Da Du auf eine Zeichenvertauschungserkennung "scharf" bist
(SCNR) bist, ist eine CRC-16 zwingend :-)

Sofern diese n gestoerten Bits mit gleicher Wahrscheinlichkeit
auftreten:
b=r+1 Fehlerbursts werden mit 2^(-r+1) nicht erkannt
b>r+1 Fehlerbursts werden mit 2^(-r) nicht erkannt
(-> Jungnickel, Codierungstheorie)

Fuer r=16 also 17er Fehlerbursts zu ~ 1:32000
Fuer r=16 also >17er Bursts zu ~1:65000

Mit ein paar Annahmen zu Deinem Fehlermodell auf Layer1
(jedes Bituebertragung unabhaengiges Ereignis mit z.B.
10^-6 Fehlerwahrscheinlichkeit (also Erfolgsw.=99,9999%),
kommt man bei einem Block von 10000 Bits auf 99,00%
Blockuebertragungserfolg ohne Fehler. Und nun sieht man sich
die Burst-Fehler an und ueberlegt sich bei den verbleibenden
Fehlern, ob das Anforderungsdokument des Systems das
Restfehlermodell impliziert.

Mag man die Rechnerei nicht, gab es schon ein paar
gute Praktikerabschaetzungen in Thread...

VG,
Hans

von Purzel H. (hacky)


Lesenswert?

Ein vernuenftiges Protokol macht auch schon was. zB, dass jede Meldung 
des Master vom Slave quitiert werden muss. Wenn man einen vorgegebenen 
Master und einen oder mehrere Slaves hat, so macht das so Sinn. Also 
auch ein Steuercommand bewirkt eine Antwort. Der Slave muss also immer 
in einem sicheren Zustand sein, resp von selbst dahin gelangen.

von hardy (Gast)


Lesenswert?

Ich danke Euch allen für die Antworten!
Mit den Informationen sollte ich es doch in den Griff bekommen.

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.