如何在不打开Linux的情况下找到所有串行设备(ttyS,ttyUSB等)?
获取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
不打开的情况下调用函数,或者以不导致建立连接的方式打开设备?
我该怎么办?
回答:
该/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/dev188: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/driverlrwxrwxrwx 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/
以上是 如何在不打开Linux的情况下找到所有串行设备(ttyS,ttyUSB等)? 的全部内容, 来源链接: utcz.com/qa/423430.html