3

是否可以使用 SocketCAN 发送“一次性”CAN 消息?这基本上是一条不期望接收者回复确认的消息。协议允许不设置该 ACK 位。

4

2 回答 2

2

我不确定您所说的“一次性”是什么意思,但我一直使用can-utilscansend中的实用程序发送单个 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

在上面的序列中,没有消费者在线,所以没有人确认消息,但我仍然只捕获了一个数据包can0cansend似乎可以安全地得出结论,SocketCAN 堆栈不是“自动”尝试在退出后在后台重新发送消息。

于 2017-10-17T19:02:15.653 回答
0

CAN 帧将一次又一次地重新传输,直到检测到总线错误(总线关闭)。这是由 CAN 外围设备完成的(它是规范的一部分,搜索“重传”),SocketCan 对此一无所知。

SocketCan 允许您订阅总线/控制器上的不同错误通知。通常,CAN 外设/驱动程序仅实现这些错误子集的信号。如果幸运的话,您可以订阅(参见 4.1.2)通知并做出相应的反应。

于 2018-03-10T18:35:44.030 回答