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
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.
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.
- 1. Einstellung SocketCAN Bitrate programmgesteuert
- 2. Socketcan registrieren Listener heißt nicht
- 3. Tiny-CAN I-XL SocketCAN erweitertes Format
- 4. Was ist das `Flags'-Feld für in canfd_frame in SocketCAN?
- 5. Senden Sie Sms mit Genymotion
- 6. Senden Sie Benachrichtigungen mit Rabbitmq
- 7. Senden Sie HTTP.post() mit XML?
- 8. Senden Sie SMS mit C#
- 9. Senden Sie Objekt mit Volley
- 10. Senden Sie SMS mit GPRS
- 11. Senden Sie Formulardaten mit Ajax
- 12. Senden Sie Javamail mit Office365
- 13. Senden Sie ein Formular mit mehreren Senden Schaltflächen - PHP
- 14. So senden Sie eine Ressourcensammlung mit Restangular?
- 15. Senden Sie eine POST-Anfrage mit Node.js
- 16. Mit Bezugsgrößen oder sie senden als Funktionsparameter
- 17. Android Senden Sie SMS mit App-Name
- 18. So senden Sie eine Benachrichtigung mit Firebase
- 19. So senden Sie $ _GET-Werte mit .htaccess
- 20. So senden Sie rohe Abfragezeichenfolge mit Sequel
- 21. Senden Sie HTML mit FormData und Ajax
- 22. So senden Sie mehrere Parameter mit MultipartUploadRequest
- 23. So senden Sie SMS mit Delphi-Code
- 24. Senden Sie zufällige Cookies mit Scrapy Anfragen
- 25. So senden Sie Basic Auth mit Axios
- 26. So senden Sie E-Mail mit Hyperlink
- 27. So senden Sie WebDAV-Header mit Ruby?
- 28. So senden Sie SNMP-Traps mit PowerShell?
- 29. Senden Sie EMail mit asp.net mvc
- 30. Senden Sie Twitter-Direktnachricht mit curl
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
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