2017-09-19 3 views
1

Ist es möglich, eine "One-Shot" CAN-Nachricht mit SocketCAN zu senden? Dies ist im Grunde eine Nachricht, die keine Rückbestätigung vom Empfänger erwartet. Das Protokoll ermöglicht, dass dieses ACK-Bit nicht gesetzt wird.Senden Sie One-Shot-Nachricht mit SocketCAN

Antwort

0

Ich bin nicht sicher, was Sie mit „One-Shot“, aber ich einzelne CAN senden Frames die ganze Zeit mit dem cansend Dienstprogramm von can-utils, wie folgt aus:

$ cansend can0 135#02080426A10D112A 

ich auch geschrieben habe C-Programme, die dasselbe unter Verwendung eines AF_CAN Sockets tun. (Sie können grundsätzlich von cansend.c Krippe, herauszufinden, wie.)

Im Hinblick auf erneute Übertragung von Nachrichten, dies nicht geschieht mit cansend:

$ timeout 20s tcpdump -i can0 -w out.pcap &                                    
[1] 16509 
tcpdump: listening on can0, link-type CAN_SOCKETCAN (CAN-bus with SocketCAN headers), capture size 262144 bytes 

$ cansend can0 135#02080426A10D112A 

$ 1 packet captured 
0 packets received by filter 
0 packets dropped by kernel 

[1] + 16509 exit 124 timeout 20s tcpdump -i can0 -w out.pcap 

In der Reihenfolge oben gibt es keine Verbraucher online, so dass niemand ACKs die Nachricht, aber ich immer noch nur ein einzelnes Paket auf can0 erfassen. Es scheint sicher zu schlussfolgern, dass der SocketCAN-Stack nicht automatisch versucht, die Nachricht im Hintergrund erneut zu senden, nachdem cansend beendet wurde.

+0

Wenn Sie keinen Empfänger zum Lesen der Nachricht und zum Zurücksenden von ACK haben, versucht der Sender dies erneut. Ich möchte nur eine Nachricht senden und wenn niemand da ist, um sie zu lesen, wäre sie verloren, aber der Absender würde weitergehen. – ilya1725

+0

Ich habe meine Antwort aktualisiert, um festzustellen, dass 'cansend' nicht versucht, Nachrichten erneut zu übertragen. Ich habe ziemlich viel mit CAN gearbeitet, aber ich bin keineswegs ein Experte, also ... vielleicht habe ich dein Problem missverstanden. Können Sie nicht "cansend" (z. B. 'system()') verwenden, um Ihr erklärtes Ziel zu erreichen? – evadeflow

0

Der CAN-Frame wird immer wieder übertragen, bis ein Busfehler erkannt wird (Bus aus). Dies geschieht durch die CAN-Peripherie (es ist Teil der spec, Suche nach "Retransmission"), SocketCan weiß nichts darüber.

SocketCan ermöglicht es Ihnen, verschiedene error notifications auf dem Bus/Controller zu abonnieren. Im Allgemeinen implementieren CAN-Peripheriegeräte/Treiber nur die Signalisierung einer Teilmenge dieser Fehler. Wenn Sie Glück haben, können Sie subscribe (see 4.1.2) für Benachrichtigungen und reagieren entsprechend.