1、USB转串口设备
USB转串口设备是在嵌入式软件开发过程中经常要使用的,常常用于对接各种各样的串口设备。如果一台linux主机上使用多个usb转串口设备时,应用程序中就需要知道自己操作的是哪个串口设备。串口设备在系统上电时,由于驱动加载的顺序不能会出现串口设备号不一样的情况,比如接了A串口,B串口到USB接口上,可以在系统上加载出来的串口为变化,有时A串口是/dev/ttyUSB0, 有时B串口是/dev/ttyUSB0。因此应用程序要有一个方法能准确的找到对应的串口 。
2、确定串口设备的方法
usb总线在/sys/bus/usb/device目录下有对应的目录的,不同usb设备连接到系统上会生成一个特定的目录的。如下/sys/devices/platform/fd800000.usb/usb1/1-1/1-1.1/1-1.1:1.0,这是一个USB设备的目录结构:
这里有一个简要的命名规则:
- platform/fd800000.usb:
platform
:这通常表示该设备是通过平台设备驱动程序(platform device driver)管理的。平台设备驱动程序通常用于描述硬件平台特有的设备,这些设备通常不遵循标准的设备驱动程序模型。fd800000.usb
:这是平台设备的名称,可能由设备树(device tree)或硬件平台代码指定。它通常与设备的物理地址或其他硬件标识信息有关。
- usb1:
- 这表示这是系统上的第一个USB控制器(或称为USB主机控制器)。在Linux中,USB控制器通常按其在系统中的顺序进行编号(usb1、usb2等)。
- 1-1:
- 这表示连接到第一个USB控制器(usb1)的第一个设备。USB设备在其连接的控制器下按层级进行编号。第一个设备是1-1,第二个设备是1-2,依此类推。
- 1-1.1:
- 如果一个USB设备具有内置的USB端口(例如USB集线器),则连接到该设备的设备会在其下进一步编号。在这个例子中,
1-1.1
表示连接到1-1
设备(即连接到usb1的第一个设备)的第一个设备。
- 如果一个USB设备具有内置的USB端口(例如USB集线器),则连接到该设备的设备会在其下进一步编号。在这个例子中,
- 1-1.1:1.0:
- 最后的
:1.0
表示这是1-1.1
设备上的第一个接口。USB设备可以有多个接口(interface),每个接口都提供不同的功能。例如,一个USB摄像头可能有一个视频接口和一个音频接口。这些接口在设备下按数字顺序编号(1.0、1.1等)。
- 最后的
总结来说,这个路径表示了一个USB设备树,从平台的USB控制器开始,经过一个或多个USB设备,最终到达一个特定的USB接口。这种结构使得内核和用户空间程序能够轻松地遍历和识别系统中的USB设备。
因此应用程序可以通过唯一的USB设备路径来查找到USB转串口设备,当然也可以查找到其他USB设备,可以编写一段程序,在/sys/bus/usb/device目录查找每一个文件夹,当找到文件夹中对的usb PID, VID与目标设备相符时,就是找到了这个USB设备的对应路径。
有没有更简单的方法么?答题是有的,可以udevadm命令,如使用udevadm命令查找/dev/ttyUSB0设备对的路径:udevadm info -q path -n /dev/ttyUSB0
可以看到查找到ttyUSB0设备位于路径:/sys/devices/platform/fd800000.usb/usb1/1-1/1-1.2/1-1.2:1.0/下面。这个路径与硬件上USB接口一一对应,因此可通过这个USB总线的路径来查看其加载出来的串口设备号,最后找到对应的串口。
这里提供一段python程序代码,用于从USB总线路径中找到其USB转串口设备的设备号。
import os
strpath = '/sys/devices/platform/fd800000.usb/usb1/1-1/1-1.2/1-1.2:1.0'
hd = os.popen(r'ls %s | grep ttyUSB' %strpath)
uartid = hd.read()[:-1]
uartid = '/dev/%s' %uartid