繁体   English   中英

SocketCAN linux 没有可用的缓冲区空间

[英]SocketCAN linux no buffer space available

我想使用带有此设备的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)

我已经在做一些研究,发现对于某些人来说,设置txqueuelentxqueuelen 然而,这对我没有帮助。 此脚本的输出如下所示:

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。

在启动链接之前,需要先设置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。

为什么不使用流量控制(例如轮询/选择)来限制您的 TX 流到硬件带宽? 这有点棘手,但对我来说效果很好。 我在这里解释了如何做: https : //stackoverflow.com/a/70521517/5096925

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM