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.
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.
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.
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.
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...
"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?
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. :-)
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? :-)
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.
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!
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
> 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.
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...
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.
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.