写入:无可用缓冲区 socket-can/linux-can

12

我正在运行一个带有两个CAN通道的程序(使用TowerTech CAN Cape TT3201)。

这两个通道是can0(500k)和can1(125k)。can0通道正常工作,但can1会出现写入“无可用缓冲区”的错误。

我正在使用ValueCAN3/VehicleSpy检查消息。

这是在我运行程序之前。can0和can1都似乎发送了消息,但只有can0出现在VehicleSpy中。

root@cantool:~# cansend can0 100#00 
root@cantool:~# cansend can1 100#20

在此输入图像描述

这是我尝试运行程序后的结果

root@cantool:~# cansend can1 100#20 
write: No buffer space available 
root@cantool:~# cansend can0 111#10

当我的程序正在运行时:我对要在can1上发送的所有消息都收到了这个错误

在此输入图片描述

2016-11-02 15:36:03,052 - can.socketcan.native.tx - WARNING - Failed to send: 0.000000    12f83018    010    1    00 
2016-11-02 15:36:03,131 - can.socketcan.native.tx - WARNING - Failed to send: 0.000000    0af81118    010    6    00 00 00 00 00 00 
2016-11-02 15:36:03,148 - can.socketcan.native.tx - WARNING - Failed to send: 0.000000    12f81018    010    6    00 00 00 00 00 00 
2016-11-02 15:36:03,174 - can.socketcan.native.tx - WARNING - Failed to send: 0.000000    0af87018    010    3    00 00 00 
2016-11-02 15:36:03,220 - can.socketcan.native.tx - WARNING - Failed to send: 0.000000    12f89018    010    4    00 00 00 00 
2016-11-02 15:36:03,352 - can.socketcan.native.tx - WARNING - Failed to send: 0.000000    12f83018    010    1    00 

然而有时整个程序会完美运行(如果模块被重新启动或发生某些随机事件)。

我该如何解决这个问题?

root@cantool:~# uname -r 
4.1.15-ti-rt-r43

经过一番搜索,我找到了这个。

 root@cantool:-#ip -details link show can0
 4:can0: <NOARP,UP,LOWER_UP, ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 10
      link/can promiscuity 0
      can state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 100
      bitrate 500000 sample-point 0.875
      tq 125 prop-seg 6 phase-seg1 7 phase-seg2 2 sjw 1
      c_can: tseg1 2..16 tseg2 1..8 sjw 1..4 brp 1..1024 brp-inc 1
      clock 24000000
 root@cantool:-#ip -details link show can1
 5: can1: <NOARP,UP,LOWER_UP, ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 10
      link/can promiscuity 0
      can state STOPPED restart-ms 100
      bitrate 125000 sample-point 0.875
      tq 500 prop-seg 6 phase-seg1 7 phase-seg2 2 sjw 1
      c_can: tseg1 2..16 tseg2 2..8 sjw 1..4 brp 1..64 brp-inc 1
      clock 8000000

原来can1由于某些原因已经停止

但是当我尝试:

ip link set can1 type can restart 
RNETLINK answers: Invalid argument
1个回答

15

当您使用sudo ifconfig can0 up命令启用can0接口后,请运行以下命令:

sudo ifconfig can0 txqueuelen 1000

这将增加排队机制中每个内核传输队列允许的帧数。更多信息请参见此处
有时整个程序可以完美运行(如果模块重新启动或出现一些随机情况)。
当您重新启动SocketCAN接口时,它能够正常工作的原因是您可能清除了足够的缓冲区空间以使其正常工作。

还可以使用ip-link命令。ip link set can0 txqueuelen 1000 - Dawierha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接