获取 Linux 系统上所有可用串行端口/设备列表的正确方法是什么?
换句话说,当我遍历 /dev/
中的所有设备时,我如何以经典方式判断哪些是串行端口,即通常支持波特率和 RTS/CTS 流控制的那些?
解决方案将用 C 编码。
我问是因为我使用的第三方库明显错误:它似乎只迭代 /dev/ttyS*
。问题在于,例如,USB 上的串行端口(由 USB-RS232 适配器提供),这些端口列在 /dev/ttyUSB* 下。阅读 Linux.org 上的 Serial-HOWTO 后,我了解到随着时间的推移,还会有其他名称空间。
所以我需要找到检测串口设备的官方方法。问题是似乎没有记录,或者我找不到它。
我想一种方法是从 /dev/tty*
打开所有文件并在它们上调用特定的 ioctl()
仅在串行设备上可用。不过,这会是一个好的解决方案吗?
更新
hrickards 建议查看“setserial”的来源。它的代码完全符合我的想法:
首先,它打开一个设备:
fd = open (path, O_RDWR | O_NONBLOCK)
然后它调用:
ioctl (fd, TIOCGSERIAL, &serinfo)
如果该调用没有返回错误,那么它显然是一个串行设备。
我在 _Serial Programming/termios_ 中发现了类似的代码,它建议还添加 O_NOCTTY
选项。
但是,这种方法存在一个问题:
当我在 BSD Unix(即 Mac OS X)上测试这段代码时,它运行良好。 但是,通过蓝牙提供的串行设备会导致系统(驱动程序)尝试连接到蓝牙设备,这需要一段时间才能返回超时错误。这是由于刚刚打开设备造成的。我可以想象类似的事情也会发生在 Linux 上——理想情况下,我不需要打开设备来确定它的类型。我想知道是否还有一种方法可以在没有打开的情况下调用 ioctl
函数,或者以不会导致建立连接的方式打开设备?
我应该怎么办?
原文由 Thomas Tempelmann 发布,翻译遵循 CC BY-SA 4.0 许可协议
/sys
文件系统应该包含大量信息用于您的任务。我的系统(2.6.32-40-generic #87-Ubuntu)建议:它为您提供了系统已知的所有 TTY 设备的描述。一个精简的例子:
以下链接之一:
此处
dev
文件包含以下信息:这是主要/次要节点。这些可以在
/dev
目录中搜索以获得用户友好的名称:/sys/class/tty
目录包含所有 TTY 设备,但您可能希望排除那些讨厌的虚拟终端和伪终端。我建议您仅检查具有device/driver
条目的那些: