在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)
如果这个调用没有返回错误,那么显然它是一个串行设备。我在 串口编程/termios 中找到了类似的代码,建议同时添加
O_NOCTTY
选项。然而,这种方法存在一个问题:
当我在 BSD Unix(即 Mac OS X)上测试此代码时,它也能正常工作。但是,通过蓝牙提供的串行设备会导致系统(驱动程序)尝试连接到蓝牙设备,在超时错误返回之前需要一段时间。这是由于只打开设备引起的。我可以想象在Linux上也可能发生类似的情况-理想情况下,我不应该需要打开设备来确定其类型。我想知道是否有一种方法可以在不打开设备的情况下调用ioctl函数,或者以不会导致连接被建立的方式打开设备?
我该怎么办?