【问题标题】:SocketCAN linux no buffer space availableSocketCAN linux没有可用的缓冲区空间
【发布时间】:2018-09-07 11:38:29
【问题描述】:

我想通过device 使用 socketCAN 定期发送消息

我创建了一个小脚本来实现这一点,如下所示:

import os
import time

msg = "1FF#FFFFF00000000000"

os.system("sudo slcand -o -c -f -s6 /dev/serial/by-id/*CANtact* can0")
os.system("sudo ifconfig can0 up")
os.system("sudo ifconfig can0 txqueuelen 1000") # this does not help

start = time.time()
while True:
    if round(time.time() - start, 1) % 60 == 0.:
        print(str(int((time.time() - start) / 60)) + " minutes")
    os.system("cansend can0 " + msg)
    time.sleep(0.1)

我已经在做一些研究,发现对于某些人来说,设置txqueuelen 是可行的。但是,这对我没有帮助。该脚本的输出如下所示:

0 minutes
1 minutes
[...]
15 minutes
16 minutes
18 minutes
write: No buffer space available
write: No buffer space available
write: No buffer space available
write: No buffer space available
write: No buffer space available
write: No buffer space available
[and so on]

设备在该错误发生之前停止发送这些消息。输入和输出流量的 LED 指示灯会在错误消息出现前大约 10 秒到几分钟停止闪烁。此外,我无法在接收方阅读任何内容。缓冲区填满所需的时间变化很大,从几分钟到几小时不等。不过通常在 10-20 分钟内。

我曾想过可能会有接收缓冲区之类的东西,因为我从未从中读到它只是填满。但我不知道这是否真的如此,也不知道如何测试它或如何刷新缓冲区或重置它或其他什么。我只需要发送我的消息。我不关心其他任何事情。

之后唯一的解决方案是重新启动为设备供电的 Raspberry Pi。

【问题讨论】:

  • 公交车上有人听吗?
  • 不,只有我的 PC 在一个端点和另一台设备接收这些消息。
  • 这看起来很可疑:os.system("sudo slcand -o -c -f -s6 /dev/serial/by-id/*CANtact* can0") - 在命令行终端上运行 lsusb 会得到什么?

标签: python raspberry-pi buffer can-bus socketcan


【解决方案1】:

ifconfig-parameters 需要在你调出链接之前设置,但是你在设置参数之前调出链接。所以我不确定当你运行脚本时你实际上有一个 1000 的 txqueuelen。 ifconfig can0 的输出可能会显示这一点。

尝试切换 ifconfig 命令的顺序。

代替:

os.system("sudo ifconfig can0 up")
os.system("sudo ifconfig can0 txqueuelen 1000")`

做:

os.system("sudo ifconfig can0 txqueuelen 1000")
os.system("sudo ifconfig can0 up")

我个人还会添加一个命令以在脚本结束时关闭 can0。

【讨论】:

  • 有趣的是,我在使用 PYUAVCAN 18 分钟后就遇到了类似的问题,并且增加 txqueuelen 不起作用。需要进一步研究。
猜你喜欢
  • 2017-03-18
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
  • 2010-11-16
  • 2016-08-08
  • 1970-01-01
  • 2015-11-05
  • 2012-04-26
相关资源
最近更新 更多