Doppelt senden oder CRC

Gast #3997984
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.
#3998006
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.
Gast #3998015
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.
Gast #3998042
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...
Gast #3998061
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?
Gast #3998122
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!
Gast #3998142
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.
Gast #3998144
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...
Gast #4007672
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.
Gast #4007725
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren