使用SocketCAN发送一次性消息

时间:2017-09-19 21:48:56

标签: linux can-bus socketcan

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

2 个答案:

答案 0 :(得分:0)

我不确定你是什么意思" one-shot",但是我使用来自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

在上面的序列中,没有在线消费者,所以没有人确认消息,但我仍然只捕获can0上的一个数据包。似乎可以肯定的是,SocketCAN堆栈并不是自动化的。在cansend退出后尝试在后台重新发送邮件。

答案 1 :(得分:-1)

CAN帧将一次又一次地重发,直到检测到总线错误(总线关闭)。这是由CAN外设完成的(它是spec的一部分,搜索"重传"),SocketCan对此一无所知。

SocketCan允许您在总线/控制器上订阅不同的error notifications。通常,CAN外围设备/驱动程序仅实现这些错误子集的信令。如果幸运的话,您可以subscribe (see 4.1.2)收到通知并作出相应的反应。