CAN - doppelte Botschaft beim Empfänger Möglichkeiten?

Dieser Link sagt Folgendes: Die Verwendung von Sequenznummern behebt den doppelten Fehler .

Wann können doppelte Nachrichten bei einem Empfänger landen?

Wenn ein Knoten einen Fehler erkennt, sendet er ein Fehler-Flag aus, und wenn alle anderen empfangenden Knoten den Fehler erkennen, senden auch sie Fehler-Flags aus und zerstören die empfangene Nachricht. Der Sender sendet die Nachricht dann erneut.

Mir ist nicht bekannt, dass möglicherweise doppelte Nachrichten empfangen werden ...

Bitte helfen Sie mir, da ich entscheiden muss, ob in meinen Nachrichten eine Sequenznummer verwendet werden muss oder nicht.

Danke

Antworten (2)

Die von Ihnen verlinkte Präsentation handelt von einer Situation, in der ein Empfänger eine Nachricht akzeptiert, ein Sender dieselbe Nachricht jedoch als falsch übertragen erkennt. Derzeit verstehe ich nicht genau, wie das passieren würde, aber ich denke, ein Empfänger könnte Daten aus einem Frame verwenden, bei dem das ACK-Bit aus irgendeinem Grund nicht gesetzt wird, was dazu führt, dass der Sender den Frame erneut sendet.

Der genaue Grund, warum dies passieren kann oder würde, ist meiner Meinung nach irrelevant, sondern Sie müssen sich überlegen, welche Art von Daten Sie übertragen: Wenn Sie z. B. den aktuellen Wert eines Sensormesswerts regelmäßig über den Bus senden, erfolgt keine erneute Übertragung schlechte Sache. Wenn Ihre Nachricht andererseits einen kleinen Teil eines größeren Datenblocks enthält, führt das erneute Senden dieses Teils dazu, dass der größere Block beschädigt wird. Aus diesem Grund enthalten Protokolle wie CCP oder XCP einen Nachrichtenzähler.

"Ein Sender erkennt dieselbe Nachricht als falsch übertragen" Ich nehme an, dies könnte durch Rauschen auf der Rx-Leitung zwischen dem CAN-Transceiver und der MCU verursacht werden? Diese Signale sind nicht differenziell und reine TTL-Pegel. Bei einem schlechten PCB-Design ist es also durchaus möglich, dass Sie damit Probleme bekommen, insbesondere bei höheren Baudraten.
Die Wahrheit ist, wenn Ihre CAN-Knoten Nachrichten inkonsistent empfangen, ist das gesamte System kaputt. Nachrichtenzähler helfen nicht, Sie müssen den Bus reparieren, wenn Sie möchten, dass er funktioniert. Der Grund, warum XCP einen Nachrichtenzähler hat, liegt darin, dass es unzuverlässige Übertragungsmedien wie Ethernet unterstützt.
@ 0x6d64- Ja, ich sende Daten in Paketen (großer Block in kleinen Stücken).
@Lundin- Deine Situation scheint möglich. Ein Sender sendet eine Nachricht, die Empfänger empfangen die Nachricht ohne Fehler, aber das ACK-Flag am Senderende wird nicht dominant und bleibt aufgrund von Rauschen/Ausfall des RX-Pins zwischen dem Tranceiver und der MCU rezessiv. Dies veranlasst den Sender, die Nachricht erneut zu senden und den Übertragungsfehlerzähler zu erhöhen (bis zu 127, bevor er in den passiven Fehlermodus wechselt). Aber wenn der Sender ein Fehlerflag aussendet (wenn im Fehlerfall aktiv), zerstören die Empfänger dann nicht die empfangene Nachricht?
@ 0x6d64- Ja, ich sende riesige Datenmengen, die in kleinere Pakete fragmentiert sind.
@AkshayImmanuelD: Dann sollten Sie meiner Meinung nach einen Nachrichtenzähler oder eine andere Methode einschließen, um die gesamte Summe zu überprüfen (wie eine Prüfsumme über den Datenblock, nachdem er auf dem Empfänger neu kombiniert wurde).
@0x6d64- Ja, ich verwende Nachrichtenzähler. 2 Byte für Befehl, 2 Byte für Sequenznummer/Nachrichtenzähler (aufgeteilt in 1 Byte für Paketnummer, 1 Byte für Gesamtpakete). Dann kann ich am Empfängerende eine Dispatch-Tabelle verwenden, um den Befehl zu indizieren und in einem Array zu platzieren, wobei der empfangene Nachrichtenzähler der Array-Speicherort ist. Wenn die empfangene Paketnummer mit der Gesamtzahl der Pakete übereinstimmt, wird ein Flag gesetzt, um anzuzeigen, dass die gesamte Nachricht empfangen wurde

Möglichkeit 1:

Der Zeitpunkt, zu dem eine Nachricht als gültig angenommen wird, ist für den Sender und die Empfänger der Nachricht unterschiedlich. Der Sender prüft alle Bits bis zum Ende des END OF FRAME-Feldes. Empfänger betrachten eine Nachricht als gültig, wenn bis zum vorletzten Bit von END OF FRAME kein Fehler vorliegt. Der Wert des letzten Bits von END OF FRAME wird als egal behandelt (ein dominanter Wert führt nicht zu einem FORM ERROR). Dieser Unterschied in der Interpretation eines gültigen Sendens/Empfangens einer Nachricht kann zu inkonsistenten Auslassungen/Duplikaten von Nachrichten führen. Wenn ein Sender feststellt, dass das letzte Bit dominant statt rezessiv ist, sendet er erneut. Der Empfänger hat keine Ahnung, dass es sich um eine doppelte Nachricht handelt, da er die vorherige Nachricht nicht als Fehler betrachtet hat.

Referenz für die Antwort

Rahmenbedingungen überlasten

Aber jetzt, da der Sender weiß, dass es sich um einen Fehler handelt, sendet er die Nachricht erneut ohne Fehlerflag? Oder sendet es ein Fehlerflag und sendet dann erneut? Wenn es ein Fehler-Flag sendet und dann erneut überträgt, wenn die Empfänger ein vom Sender gesendetes Fehler-Flag erkennen, zerstören sie dann nicht die zuvor empfangenen Nachrichten??? Auch hier werden an den Knoten keine doppelten Nachrichten empfangen. Ich bin immer noch verwirrt über die Antwort, die ich gepostet habe, da der Link nicht über dieses Szenario spricht, das ich erwähnt habe. Bitte helfen