使用 SocketCAN 发送一次性消息
Send one-shot message using SocketCAN
是否可以使用 SocketCAN 发送 "one-shot" CAN 消息?这基本上是一条不期望接收方返回确认的消息。协议允许不设置此 ACK 位。
我不确定你所说的 "one-shot" 是什么意思,但我一直使用 can-utils 中的 cansend
实用程序发送单个 CAN 帧,如下所示:
$ cansend can0 135#02080426A10D112A
我还编写了使用 AF_CAN
套接字执行相同操作的 C 程序。 (你基本上可以从 cansend.c
中找到答案。)
关于消息的重新传输,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
在上面的序列中,没有消费者在线,所以没有人确认消息,但我仍然只在can0
上捕获了一个数据包。似乎可以安全地得出结论,SocketCAN 堆栈不会 'automagically' 在 cansend
退出后尝试在后台重新发送消息。
CAN 帧将一次又一次地重新传输,直到检测到总线错误(总线关闭)。这是由 CAN 外围设备完成的(它是 spec 的一部分,搜索 "retransmission"),SocketCan 对此一无所知。
SocketCan 允许您订阅不同的 error notifications on the bus/controller. In general, CAN peripherals/drivers implement the signaling of a subset of these errors only. If you are lucky, you could be able to subscribe (see 4.1.2) 通知并做出相应的反应。
是否可以使用 SocketCAN 发送 "one-shot" CAN 消息?这基本上是一条不期望接收方返回确认的消息。协议允许不设置此 ACK 位。
我不确定你所说的 "one-shot" 是什么意思,但我一直使用 can-utils 中的 cansend
实用程序发送单个 CAN 帧,如下所示:
$ cansend can0 135#02080426A10D112A
我还编写了使用 AF_CAN
套接字执行相同操作的 C 程序。 (你基本上可以从 cansend.c
中找到答案。)
关于消息的重新传输,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
在上面的序列中,没有消费者在线,所以没有人确认消息,但我仍然只在can0
上捕获了一个数据包。似乎可以安全地得出结论,SocketCAN 堆栈不会 'automagically' 在 cansend
退出后尝试在后台重新发送消息。
CAN 帧将一次又一次地重新传输,直到检测到总线错误(总线关闭)。这是由 CAN 外围设备完成的(它是 spec 的一部分,搜索 "retransmission"),SocketCan 对此一无所知。
SocketCan 允许您订阅不同的 error notifications on the bus/controller. In general, CAN peripherals/drivers implement the signaling of a subset of these errors only. If you are lucky, you could be able to subscribe (see 4.1.2) 通知并做出相应的反应。