我有一个连接到Raspberry Pi的设备。 Pi正在运行ARCH Linux。设备通过USB与Pi通信。必须通过脉冲打开和关闭设备,我从Pi控制一个导致该脉冲的继电器。但是我永远无法确定设备最初是打开还是关闭。
在我的代码中,我切换继电器,然后推测性地调用设备上的open()(带有标志O_RDWR | O_NOCTTY)。问题是,如果我在设备关闭时执行此操作,则open()调用将挂起。我已经尝试在切换后等待1秒钟,以便解决问题,但这并没有帮助。我试过在open()调用之前调用stat()但是这总是返回零(所以设备就像stat()一样)。我已尝试在open()调用中指定O_NON_BLOCK,但这会导致它始终失败。
任何人都可以建议(a)我做错了什么或(b)可靠的前进方式?
答案 0 :(得分:1)
如果你可以确定设备最终会出现,那么阻止open()
("挂起")实际上可能就是你想要的!当您的设备出现时,对open()
的调用将会返回,希望成功。
stat()
调用只是检查设备特殊文件是否存在。它无法告诉你是否有任何聆听。
一种可能的前进方式是open()
O_NONBLOCK
指数退避循环。
根据您的意思"通过USB"进行通信,您可能需要使用libusb。如果它只是一个USB串口,那么自己包装open()
可能是最简单的。
答案 1 :(得分:1)
如果USB枚举,您可以确定设备已通电。您可以使用libudev查找USB枚举设备列表,并检查您的设备是否在该列表中。
命令行“lsusb”就是这样做的。因此,如果您需要一个如何使用libudev的示例,那么您可以阅读lsusb源代码(https://github.com/gregkh/lsusb)。
答案 2 :(得分:1)
目前还不清楚你做了什么来获得一个可以断开连接的设备文件。
通常的方法是使用hotplug
+ udev
来创建(和删除)设备符号链接,然后只有在插入设备时才会出现特殊文件。
答案 3 :(得分:0)
由以下所有乐于助人的人提供,快速回答是在我的.rules文件中包含“删除”操作以与现有的“添加”操作一起使用。所以在我所拥有的文件中:
ACTION=="add", ATTRS{interface}=="Pololu Orangutan X2 Serial Adapter", MODE="7777", SYMLINK+="OrangutanUSB"
...给我一个/ dev / OrangutanUSB设备,我添加了一个新行:
ACTION=="remove", ATTRS{interface}=="Pololu Orangutan X2 Serial Adapter", MODE="7777", SYMLINK-="OrangutanUSB"
...导致操作系统在关闭电源后删除/ dev / OrangutanUSB设备。这样,当设备离开时,open()调用会正确失败,而不是挂起。
最终,我应该做的是检查设备是否被枚举,而不是期望open()失败,但这可以等到我有时间。现在,我的代码按原设计工作。