获取Linux系统上所有可用串行端口/设备列表的正确方法是什么?
换句话说,当我遍历中的所有设备时/dev/,如何以经典方式分辨哪些设备是串行端口,即那些通常支持波特率和RTS / CTS流控制的设备?
/dev/
解决方案将用C编码。
我问是因为我正在使用第三方库,但这样做显然是错误的:它似乎仅在上进行迭代/dev/ttyS*。问题是,例如,存在USB上的串行端口(由USB- RS232适配器提供),而这些端口在/ dev / ttyUSB *下列出。在Linux.org上阅读Serial-HOWTO时,我发现随着时间的流逝,还将有其他名称空间。
/dev/ttyS*
因此,我需要找到检测串行设备的官方方法。问题是似乎没有文件记录在案,或者我找不到它。
我想一种方法是从中打开所有文件/dev/tty*并对其进行调用ioctl(),这些文件仅在串行设备上可用。但是,这将是一个好的解决方案吗?
/dev/tty*
ioctl()
希拉克们 建议看看“ setserial”的来源。它的代码完全符合我的想法:
首先,它使用以下命令打开设备:
fd = open (path, O_RDWR | O_NONBLOCK)
然后它调用:
ioctl (fd, TIOCGSERIAL, &serinfo)
如果该调用没有返回错误,则显然是串行设备。
我在 Serial Programming / termios中 找到了类似的代码,建议也添加该O_NOCTTY选项。
O_NOCTTY
但是,这种方法存在一个问题:
当我在BSD Unix(即Mac OS X)上测试此代码时,它也可以正常工作。 但是 ,通过蓝牙提供的串行设备会导致系统(驱动程序)尝试连接到蓝牙设备,这需要一段时间才能返回蓝牙并出现超时错误。这是由于仅打开设备引起的。我可以想象在Linux上也会发生类似的事情- 理想情况下,我不需要打开设备来确定其类型。我想知道是否还有一种方法可以在ioctl不打开的情况下调用函数,或者以不导致建立连接的方式打开设备?
ioctl
我该怎么办?
该/sys文件系统应该包含你的追求大量的信息。我的系统(2.6.32-40-通用#87-Ubuntu)建议:
/sys
/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文件包含以下信息:
dev
# cat /sys/class/tty/ttyUSB0/dev 188:0
这是主要/次要节点。可以在/dev目录中搜索这些名称以获得用户友好名称:
/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条目的条目:
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/