Forum: Mikrocontroller und Digitale Elektronik Doppelt senden oder CRC


von Gustel (Gast)


Lesenswert?

Hallo,
ich möchte eine bidirektionale Datenübertragung zwischen zwei 
Controllern realisieren.
Daten befinden sich in zwei Bytes.

Nun ist die Frage was ist statistisch sicherer eine Fehlerhafte 
Übertragung der Information zu identifizieren.

Das Datenpacket nochmal senden, also 2 + 2 Byte... Dann vergleichen!

Oder

Einen CRC16 dranzuhängen. was ebenfalls 2 + 2 Bytes wären.



Danke für eure Antworten.

von Georg G. (df2au)


Lesenswert?

CRC ist deutlich besser.

von Dennis S. (eltio)


Lesenswert?

Abhängig vom Generatorpolynom ist die Erkennung mittels CRC über 95%.

von Karl H. (kbuchegg)


Lesenswert?

Wenn deine Übertragungsstrecke ein Byte konsistent und immer gleich 
verändert, dann kannst du das mit Wiederholung nicht detektieren. Denn 
auch die Wiederholung wird exakt gleich verändert wie das Original.
Einfachstes Beispiel: deine Übertragungsstrecke modifiziert alle Bytes 
zu 0x00. D.h. der Empfänger sieht 0x00,0x00 und als Widerholung 
ebenfalls 0x00 und 0x00. Woraus er schliesst, das 0x00,0x00 korrekt ist. 
Ist es aber nicht.

Eine CRC unterscheidet sich aber von den Datenbytes. D.h. selbst wenn 
der Sender 0x00, 0x00 senden will, ist die CRC dafür nicht 0x00, 0x00. 
Was der Empfänger wiederrum detektieren kann und daher weiß, dass etwas 
nicht stimmt.

Eine Nachricht zu wiederholen ist ungefähr so sinnvoll wie bei 
offensichtlichem Nichtverstehen einer Frage, dieselbe Frage in gleichem 
Wortlaut nochmal in gesteigerter Lautstärke zu wiederholen.

von Thomas M. (thomaswm)


Lesenswert?

Kannst auch eine CRC-8 nehmen..

von Michal P. (michal)


Lesenswert?

Ich habe mal alle Bits invertiert nachgeschickt und geprüft.
Bombensicher und für wenige Bytes einfacher zu berechnen als CRC.

Schöne Grüße

Michal

von Lattice User (Gast)


Lesenswert?

Gustel schrieb:
>
> Das Datenpacket nochmal senden, also 2 + 2 Byte... Dann vergleichen!

Das 2.mal sollte man die negierten Daten schicken.

>
> Oder
>
> Einen CRC16 dranzuhängen. was ebenfalls 2 + 2 Bytes wären.
>
Overkill, CRC5 bzw CRC8 reicht.

Ein ECC für 16bit braucht übrigens auch nicht mehr.

von Amateur (Gast)


Lesenswert?

Die 99€ Frage lautet: Wie genau muss es sein?

Eine einfache (8 Bit) Prüfsumme benötigt weder sehr viel Rechenleistung, 
noch viel Platz (1 Byte).

In den meisten Fällen reicht das gute alte Paritätsbit. Damit können 
viele - natürlich nicht alle - Fehler in JEDEM Byte erkannt werden.

Als zusätzliche Sicherheit kann auch eine Plausibilitätsprüfung, auf 
Softwareebene, erfolgen. Zum Bleistift sind 99°, 102° und 100° 
plausibel. 150° dazwischen aber nicht.

Übrigens: Mit einer CRC ist es ja auch nicht getan. Der Sender muss 
immer auf eine Bestätigung (min. 1 Byte) warten und es muss auch ein 
Wiederholungsprotokoll implementiert werden.

Bei den im Beispiel aufgeführten Werten, könnte man den Wert 150° durch 
den Mittelwert des Vorgängers und des Nachfolgers ersetzen.
Natürlich ist, genügend Zeit (Rechen- und Übertragungszeit) 
vorausgesetzt, eine echte Prüfsumme genauer.

von gehh (Gast)


Lesenswert?

Mit CRC Übertragungsfehler erkennen und die Message periodisch senden 
(siehe CAN).

von npn (Gast)


Lesenswert?

gehh schrieb:
> und die Message periodisch senden (siehe CAN).

CAN hat nichts mit "periodisch senden" zu tun. Wird zwar öfters so 
gemacht, aber bei weitem nicht immer. Häufig wird auch nur bei einer 
Werte- oder Zustandsänderung eine CAN-Message geschickt.
Btw: periodisch senden kann man auch auf jedem anderen Übertragungsweg 
(RS232, I²C, SPI, RS485 usw...). Das hat nichts mit CAN zu tun...

von Andreas (Gast)


Lesenswert?

"Eine Nachricht zu wiederholen ist ungefähr so sinnvoll wie bei
offensichtlichem Nichtverstehen einer Frage, dieselbe Frage in gleichem
Wortlaut nochmal in gesteigerter Lautstärke zu wiederholen." 
(Karl-Heinz)

Schlechter Vergleich bzw. Ironie, da im realen Leben doch wohl mehr als 
sinnvoll und hilft fast immer weiter;)



CRC ~95%
Warscheinlichkeit eines systematischen Fehlers: ???


Wenn man systematische Übertragungsfehler real nahe Null annimmt, iegen 
die beiden Fehlerwarscheinlichkeiten vieleicht gar nimmer so weit 
auseinander, oder?

von oszi40 (Gast)


Lesenswert?

Michal Polanski schrieb:
> Ich habe mal alle Bits invertiert nachgeschickt und geprüft.

Das wäre eine einfache Variante. Nur, wenn ein Wert davon falsch ist, 
weiß ich immer noch nicht, welcher der Beiden gesund war. :-)

von npn (Gast)


Lesenswert?

oszi40 schrieb:
> Nur, wenn ein Wert davon falsch ist,
> weiß ich immer noch nicht, welcher der Beiden gesund war. :-)

Weißt du bei einer CRC, welches von beiden Bytes falsch war? :-)

von Georg G. (df2au)


Lesenswert?

oszi40 schrieb:
> welcher der Beiden gesund war

Für solche Zwecke ist das Stichwort "ECC", es fiel weiter oben schon 
einmal. Bei 16 Prüfbits auf 16 Nutzbits ist da schon eine Menge möglich.

von Klose (Gast)


Lesenswert?

Zwei Aspekte, die nicht erwähnt wurden:

1. Was wird denn mit den Daten gemacht?
Werden sie z.B. nur zyklisch alle 100ms auf einem Display ausgegeben, 
kann man eine Prüfsumme auch weglassen. Werden die Daten 
weiterverarbeitet … was kann im schlimmsten Fall passieren?

2. Was heisst "bidirektionale Datenübertragung" genau?
Im Falle einer SPI Übertragung werden bei einer Störung der Clock ggf. 
alle Bits im Empfänger versetzt gelesen. Ein reines doppeltes Senden 
(mit oder ohne Invertierung) deckt den Fehler dann ggf. nicht auf (aber 
alles schon gesehen….)

> Eine CRC unterscheidet sich aber von den Datenbytes.
> D.h. selbst wenn der Sender 0x00, 0x00 senden will,
> ist die CRC dafür nicht 0x00.

Vorsicht! Das gilt nur, wenn der Startwert ungleich 0x00 ist. Sonst 
wirft eine CRC über 0x00…. als Wert 0x00 aus!

von Dietrich L. (dietrichl)


Lesenswert?

Was noch nicht angesprochen wurde:
Neben eine Sicherung über CRC a.Ä. ist es wichtig, dass der Anfang der 
Nachricht sicher erkannt wird. Eine Pause zwischen 2 Datensätzen ist 
eine einfache Methode. Bei einer lückenlosen Sendung braucht man ein 
eindeutiges Startzeichen bzw. Startsequenz.

Gruß Dietrich

von Klose (Gast)


Lesenswert?

> Für solche Zwecke ist das Stichwort "ECC"
ECC würde ich IMHO nicht nutzen. ECC ist auf Controllern meist auf 
aufwändiger, macht nur Sinn wenn eine Rekonstruktion der Daten wichtig 
ist. Bei zyklischen Übertragungen ohne ECC muss man halt auf das nächste 
Paket warten.

Ich würde eine CRC nutzen. Ob 8/16/32 Bit würde ich abhängig von der CPU 
machen. Meistens nutze ich eine schnelle 8/16 Bit CRC mit Lookup 
Tabelle. Startwert irgendetwas != 0.

von gehh (Gast)


Lesenswert?

npn schrieb:
> CAN hat nichts mit "periodisch senden" zu tun. Wird zwar öfters so
> gemacht, aber bei weitem nicht immer.


Richtig. Der Hinweis in Richtung CAN sollte auch nur dem Beispiel 
dienen,
da es dort meiner Meinung nach in Mehrheit so praktiziert wird.


> Häufig wird auch nur bei einer
> Werte- oder Zustandsänderung eine CAN-Message geschickt.


Dann komme ich aber um eine Fehlererkennung plus erneutem Senden bei
Übertragungsfehler nicht herum. Sende ich periodisch, kann ich mir
dieses Handling sparen. Lediglich die Zeit zwischen den Messages
könnte ggf. zu lang sein. Aber das wäre ja Definitionssache.

Sende ich bei Übertragungsfehler noch einmal, könnte auch diese Message
wieder gestört werden. Da gibt es auch keinen Unterschied zum
zyklischen Senden. Auch hier könnte die nächste Message gestört werden.


> Btw: periodisch senden kann man auch auf jedem anderen Übertragungsweg
> (RS232, I²C, SPI, RS485 usw...). Das hat nichts mit CAN zu tun...


Habe ich ja auch nicht gesagt.
Oder stand da, dass zyklisches Senden nur bei CAN eingesetzt wird, bzw.
überhaupt einsetzbar ist?
A -> B ist nicht automatisch B -> A...

von Amateur (Gast)


Lesenswert?

Gustel ist wohl nach Diktat verreist oder hat das Interesse verloren.

von Gustel (Gast)


Lesenswert?

Erstmal danke für die zahlreichen Antworten.

Also zweimal senden scheint wirklich nicht die erste Wahl sein.

Gefallen tut mir persönlich das mit den 2ten mal invertiert vor crc da 
eben weniger Rechenaufwand... zumindest wenn keine Hardware-CEC 
vorhanden ist.

Wenn Daten verloren gehen bzw. Check nicht passt wirds einfach verworfen 
und auf nächstes Paket gewartet. Welches Byte bzw. Bit da falsch war 
oder nicht ist mir dann egal.

von Postkunde (Gast)


Lesenswert?

Man sollte vielleicht auch eine Sekunde investieren, um sich die 
Ursachen von Fehlern zu vergewaertigen. Ein CRC ist gut, um sporadische 
Einzelbit Fehler zu detektieren.

Wenn man ein schlechtes Layout, einen schlechten Schaltregler und 
koppelnde Leitungen hat, die jedes 5.Bit niedermachen, sind die 
genannten Massnahmen nicht passend.

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.