在Linux上查找所有串行设备而不打开它们
1. 概述
在本文中,我们将讨论如何在 Linux 上查找所有串行设备而无需打开它们。这将显示系统拥有的设备,这在诊断或设置新设备时很有用。
2. 问题陈述
*/dev/*目录包含任何给定系统的每个设备的文件。对于串行设备,我们将仅限于那些同时支持波特率和 RTS/CTS 流控制的设备,它代表 RS-232 电信标准下的 Request-to-Send/Clear-to-Send。
我们不想打开设备,因为这可能需要一段时间并可能返回错误。尝试打开设备时,会执行连接尝试。当系统的驱动程序想要连接设备时,通过蓝牙提供的串行设备会发生这种行为的一个示例。
3. 解决方案
通过查看不同的文件并使用多种工具,我们将介绍上述问题的四种解决方案。
3.1. */sys/class/*目录
*/sys/class/目录下的文件系统提供有关连接到系统的设备的信息。在其中,*目录/sys/class/tty显示了串行设备、虚拟终端和伪终端,**具有特定串行设备组的子目录。
例如,让我们获取串行 USB 设备:
$ ls /sys/class/tty/ttyUSB*
/sys/class/tty/ttyUSB0
/sys/class/tty/ttyUSB1
如果我们访问其中一台设备的目录之一,我们会看到不同的文件:
$ ls /sys/class/tty/ttyUSB0/
dev
device
power
subsystem
uevent
**声明我们正在处理串行设备(而不是终端)的文件是device/driver。**因此,我们只能检查那些具有这些目录树的设备:
$ ls /sys/class/tty/*/device/driver
/sys/class/tty/ttyS0/device/driver
/sys/class/tty/ttyS1/device/driver
/sys/class/tty/ttyUSB0/device/driver
/sys/class/tty/ttyUSB1/device/driver
一种幼稚且错误的方法是仅遍历/dev/ttyS*目录,因为我们也可以通过其他接口访问串行设备。使用 USB 到 RS-232 适配器,串行设备位于/dev/ttyUSB* 下,如示例中所示。类似地,其他命名空间可能包含其他串行设备。
3.2. dmesg工具
使用**dmesg 工具,我们可以在屏幕上显示内核日志,其中存储了连接到系统的设备的驱动程序产生的所有信息**。我们必须从dmesg(我们感兴趣的串行设备)中搜索整个消息缓冲区:
$ dmesg | grep tty
我们可能需要以超级用户权限执行前面的命令。
3.3. HAL 软件
硬件抽象层 ( HAL ) 是一种已被udev 弃用的工具。但是,该工具仍然可以在 2008 年之前的较旧 Linux 版本上找到,这些版本也是最常见的具有旧串行接口标准的版本。
我们可以从所有可用的端口中获取那些能够进行串行传输的端口:
$ hal-find-by-capability --capability serial
这将返回唯一设备标识符的列表。我们可以将 UDI值插入:
$ hal-get-property --udi UDI --key serial.device
如果我们想探索所有串行设备,我们可以将这两个命令与一个for循环结合起来:
$ for device in $(hal-find-by-capability --capability serial) ; do
hal-get-property --udi "${device}" --key serial.device
done
3.4. */dev/serial/*目录
如果我们处理较新的 Linux 内核,HAL 工具将不再可用。但是,我们可以利用udev(只要我们安装了早于 2.5. 的版本)。
*在/dev/serial/*目录中,有一个所有可用串行端口的列表。*它们是指向适当的/dev/*文件的符号链接。我们找到两组串口:
$ ls /dev/serial/
by-id/
by-path/
这两组是指同一个串口,但根据端口的不同信息进行组织。让我们看看每个人的样子:
$ ls -l /dev/serial/by-id/
total 0
lrwxrwxrwx 1 root root 13 2010-02-10 09:03 tty-WM_Gmbh._Serial_Controller-port0 -> ../../ttyS0
lrwxrwxrwx 1 root root 13 2010-02-10 09:03 tty-WM_Gmbh._Serial_Controller-port1 -> ../../ttyS1
lrwxrwxrwx 1 root root 13 2015-07-20 04:03 usb-PTechnology_Inc._USB-Serial_Controller-if00-port0 -> ../../ttyUSB0
lrwxrwxrwx 1 root root 13 2015-07-20 04:04 usb-PTechnology_Inc._USB-Serial_Controller-if00-port1 -> ../../ttyUSB1
对于路径组,我们有:
$ ls -l /dev/serial/by-path/
total 0
lrwxrwxrwx 1 root root 13 2010-02-10 09:03 pci-0000:00:0a.0-tty-1:1:1.0-port0 -> ../../ttyS0
lrwxrwxrwx 1 root root 13 2010-02-10 09:03 pci-0000:00:0a.0-tty-1:1:1.0-port1 -> ../../ttyS1
lrwxrwxrwx 1 root root 13 2015-07-20 04:03pci-0000:00:0b.0-usb-0:3:1.0-port0-> ../../ttyUSB0
lrwxrwxrwx 1 root root 13 2015-07-20 04:04 pci-0000:00:0b.0-usb-0:3:1.1-port1 -> ../../ttyUSB1
当系统中没有串行端口时,文件系统中不存在/dev/serial/目录。