小编典典

如何在不打开Linux的情况下找到所有串行设备(ttyS,ttyUSB等)?

linux

获取Linux系统上所有可用串行端口/设备列表的正确方法是什么?

换句话说,当我遍历中的所有设备时/dev/,如何以经典方式分辨哪些设备是串行端口,即那些通常支持波特率和RTS /
CTS
流控制的设备?

解决方案将用C编码。

我问是因为我正在使用第三方库,但这样做显然是错误的:它似乎仅在上进行迭代/dev/ttyS*。问题是,例如,存在USB上的串行端口(由USB-
RS232适配器提供),而这些端口在/ dev / ttyUSB
*下列出。在Linux.org上阅读Serial-HOWTO时,我发现随着时间的流逝还将有其他名称空间。

因此,我需要找到检测串行设备的官方方法。问题是似乎没有文件记录在案,或者我找不到它。

我想一种方法是从中打开所有文件/dev/tty*并对其进行调用ioctl(),这些文件仅在串行设备上可用。但是,这将是一个好的解决方案吗?

更新资料

希拉克们 建议看看“ setserial”的来源。它的代码完全符合我的想法:

首先,它使用以下命令打开设备:

fd = open (path, O_RDWR | O_NONBLOCK)

然后它调用:

ioctl (fd, TIOCGSERIAL, &serinfo)

如果该调用没有返回错误,则显然是串行设备。

我在 Serial Programming /
termios中

找到了类似的代码,建议也添加该O_NOCTTY选项。

但是,这种方法存在一个问题:

当我在BSD Unix(即Mac OS X)上测试此代码时,它也可以正常工作。 但是
,通过蓝牙提供的串行设备会导致系统(驱动程序)尝试连接到蓝牙设备,这需要一段时间才能返回蓝牙并出现超时错误。这是由于仅打开设备引起的。我可以想象在Linux上也会发生类似的事情-
理想情况下,我不需要打开设备来确定其类型。我想知道是否还有一种方法可以在ioctl不打开的情况下调用函数,或者以不导致建立连接的方式打开设备?

我该怎么办?


阅读 679

收藏
2020-06-02

共1个答案

小编典典

/sys文件系统应该包含你的追求大量的信息。我的系统(2.6.32-40-通用#87-Ubuntu)建议:

/sys/class/tty

其中提供了系统已知的所有TTY设备的描述。精简示例:

# ll /sys/class/tty/ttyUSB*
lrwxrwxrwx 1 root root 0 2012-03-28 20:43 /sys/class/tty/ttyUSB0 -> ../../devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.4/2-1.4:1.0/ttyUSB0/tty/ttyUSB0/
lrwxrwxrwx 1 root root 0 2012-03-28 20:44 /sys/class/tty/ttyUSB1 -> ../../devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0/ttyUSB1/tty/ttyUSB1/

遵循以下链接之一:

# ll /sys/class/tty/ttyUSB0/
insgesamt 0
drwxr-xr-x 3 root root    0 2012-03-28 20:43 ./
drwxr-xr-x 3 root root    0 2012-03-28 20:43 ../
-r--r--r-- 1 root root 4096 2012-03-28 20:49 dev
lrwxrwxrwx 1 root root    0 2012-03-28 20:43 device -> ../../../ttyUSB0/
drwxr-xr-x 2 root root    0 2012-03-28 20:49 power/
lrwxrwxrwx 1 root root    0 2012-03-28 20:43 subsystem -> ../../../../../../../../../../class/tty/
-rw-r--r-- 1 root root 4096 2012-03-28 20:43 uevent

dev文件包含以下信息:

# cat /sys/class/tty/ttyUSB0/dev
188:0

这是主要/次要节点。可以在/dev目录中搜索这些名称以获得用户友好名称:

# ll -R /dev |grep "188, *0"
crw-rw----   1 root dialout 188,   0 2012-03-28 20:44 ttyUSB0

/sys/class/tty目录包含所有TTY设备,但您可能要排除那些讨厌的虚拟终端和伪终端。我建议您仅检查那些具有device/driver条目的条目:

# ll /sys/class/tty/*/device/driver
lrwxrwxrwx 1 root root 0 2012-03-28 19:07 /sys/class/tty/ttyS0/device/driver -> ../../../bus/pnp/drivers/serial/
lrwxrwxrwx 1 root root 0 2012-03-28 19:07 /sys/class/tty/ttyS1/device/driver -> ../../../bus/pnp/drivers/serial/
lrwxrwxrwx 1 root root 0 2012-03-28 19:07 /sys/class/tty/ttyS2/device/driver -> ../../../bus/platform/drivers/serial8250/
lrwxrwxrwx 1 root root 0 2012-03-28 19:07 /sys/class/tty/ttyS3/device/driver -> ../../../bus/platform/drivers/serial8250/
lrwxrwxrwx 1 root root 0 2012-03-28 20:43 /sys/class/tty/ttyUSB0/device/driver -> ../../../../../../../../bus/usb-serial/drivers/ftdi_sio/
lrwxrwxrwx 1 root root 0 2012-03-28 21:15 /sys/class/tty/ttyUSB1/device/driver -> ../../../../../../../../bus/usb-serial/drivers/ftdi_sio/
2020-06-02