当它出现时打开 /dev/ttyUSB*

Posted

技术标签:

【中文标题】当它出现时打开 /dev/ttyUSB*【英文标题】:Open /dev/ttyUSB* when it becomes present 【发布时间】:2011-09-21 09:45:31 【问题描述】:

我有一个程序在计算机运行时始终运行。它通过 USB 设备与串行接口连接。有时,当计算机打开时,设备可能不存在。

我的问题是确认设备文件何时出现的好方法。我可以创建一个无限循环来持续检查文件,假设我知道它的名称将是什么,然后在它获得 fd 时中断。但是还有比这更好的方法吗?

此外,假设在程序运行时设备被拔掉,我的 fd 现在变得无效。发生这种情况时是否会引发一些事件或错误,以便我可以再次开始检查,直到设备文件再次出现?

我使用选择循环从 fd 中读取数据。

【问题讨论】:

【参考方案1】:

在 Linux 上,可以使用udev 在插入和/或移除设备时通知您的应用程序。

有关一个很好的例子,看看这个通知器:udev-notify

libudev API 将允许您侦听内核事件,并在设备可用或设备被移除时收到通知,然后您可以决定在此类事件发生时执行操作。

【讨论】:

【参考方案2】:

从历史上看,轮询的解决方案(一个确定所述“文件”是否在某个时间间隔存在的循环)将是“最好的”解决方案。如果您使用的是现代 Linux(2.6.12+,但您没有指定),您可以使用 inotify,它可能完全符合您的要求——监视目录以创建文件 (IN_CREATE)。我链接到的 Wikipedia 文章提供了很好的概述和有用的链接。

它被拔掉的部分很棘手。当一个文件在 *nix 中被删除时(可以追溯到很久以前),它的文件描述符仍然有效。因此,我猜extern int errno; 可能是您的解决方案;您的帖子被标记为“C”,因此没有什么可“抛出”的,但如果您在 read(或其他)呼叫失败时检查此内容,您可以获得洞察力。

还可以查看 libudev,它当然更特定于设备,而不是 *nix 的一般“一切都是文件”理念。

【讨论】:

以上是关于当它出现时打开 /dev/ttyUSB*的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 python 和 pyserial 打开 /dev/ttyusb0

PN532 V3 + Arduino UNO + libnfc 错误(错误:无法打开 NFC 设备:pn532_uart:/dev/ttyUSB0:115200)

在linux使用命令配置串口

如何知道哪个设备连接在哪个 /dev/ttyUSB 端口

永久打开串口命令

动画消失时不起作用,但出现时起作用