zl程序教程

您现在的位置是:首页 >  系统

当前栏目

USB转串口设备linux随笔

Linux设备 USB 串口 随笔
2023-09-14 09:15:40 时间

第一个USB转串口设备: 

# find /sys/bus/usb/devices/ -name "ttyACM*"
#
# find /sys/bus/usb/devices/1-1.4/ -name "ttyACM*"
/sys/bus/usb/devices/1-1.4/1-1.4.1/1-1.4.1:1.0/tty/ttyACM0

第二个USB转串口设备:

# find /sys/bus/usb/devices/ -name "ttyUSB*"
#
# find /sys/bus/usb/devices/1-1.7/ -name "ttyUSB*"
/sys/bus/usb/devices/1-1.7/1-1.7.4/1-1.7.4:1.0/ttyUSB0
/sys/bus/usb/devices/1-1.7/1-1.7.4/1-1.7.4:1.0/ttyUSB0/tty/ttyUSB0
# ls -l /sys/bus/usb/devices/
total 0
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-0:1.0 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-0:1.0
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.1 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.1
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1:1.0 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.1:1.0 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.1/1-1.1:1.0
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.2 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.2.1 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2.1
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.2:1.0 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.2.1:1.0 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2.1/1-1.2.1:1.0
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.2.3 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2.3
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.2.3:1.0 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2.3/1-1.2.3:1.0
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.3 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.3
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.3:1.0 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.3/1-1.3:1.0
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.4 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4
lrwxrwxrwx 1 root root 0 Apr 19 15:43 1-1.4.1 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4/1-1.4.1
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.4:1.0 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4/1-1.4:1.0
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.4.1:1.0 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4/1-1.4.1/1-1.4.1:1.0
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.4.1:1.1 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4/1-1.4.1/1-1.4.1:1.1
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.4.2 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4/1-1.4.2
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.4.2:1.0 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4/1-1.4.2/1-1.4.2:1.0
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.4.2:1.1 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4/1-1.4.2/1-1.4.2:1.1
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.4.2:1.2 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4/1-1.4.2/1-1.4.2:1.2
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.4.2:1.3 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.4/1-1.4.2/1-1.4.2:1.3
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.5 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.5
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.5:1.0 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.5/1-1.5:1.0
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.6 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.6
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.6:1.0 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.6/1-1.6:1.0
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.7 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.7
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.7.1 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.7/1-1.7.1
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.7:1.0 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.7/1-1.7:1.0
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.7.1:1.0 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.7/1-1.7.1/1-1.7.1:1.0
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.7.1:1.1 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.7/1-1.7.1/1-1.7.1:1.1
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.7.1:1.2 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.7/1-1.7.1/1-1.7.1:1.2
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.7.1:1.3 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.7/1-1.7.1/1-1.7.1:1.3
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.7.3 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.7/1-1.7.3
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.7.3:1.0 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.7/1-1.7.3/1-1.7.3:1.0
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.7.3:1.1 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.7/1-1.7.3/1-1.7.3:1.1
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.7.3:1.2 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.7/1-1.7.3/1-1.7.3:1.2
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.7.3:1.3 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.7/1-1.7.3/1-1.7.3:1.3
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.7.4 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.7/1-1.7.4
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-1.7.4:1.0 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.7/1-1.7.4/1-1.7.4:1.0
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-4 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-4
lrwxrwxrwx 1 root root 0 Apr 19 15:56 1-4:1.0 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-4/1-4:1.0
lrwxrwxrwx 1 root root 0 Apr 19 15:56 2-0:1.0 -> ../../../devices/pci0000:00/0000:00:14.0/usb2/2-0:1.0
lrwxrwxrwx 1 root root 0 Apr 19 15:56 3-0:1.0 -> ../../../devices/pci0000:00/0000:00:1b.0/0000:03:00.0/usb3/3-0:1.0
lrwxrwxrwx 1 root root 0 Apr 19 15:56 4-0:1.0 -> ../../../devices/pci0000:00/0000:00:1b.0/0000:03:00.0/usb4/4-0:1.0
lrwxrwxrwx 1 root root 0 Apr 19 15:56 usb1 -> ../../../devices/pci0000:00/0000:00:14.0/usb1
lrwxrwxrwx 1 root root 0 Apr 19 15:56 usb2 -> ../../../devices/pci0000:00/0000:00:14.0/usb2
lrwxrwxrwx 1 root root 0 Apr 19 15:56 usb3 -> ../../../devices/pci0000:00/0000:00:1b.0/0000:03:00.0/usb3
lrwxrwxrwx 1 root root 0 Apr 19 15:56 usb4 -> ../../../devices/pci0000:00/0000:00:1b.0/0000:03:00.0/usb4

如何知道USB-tty设备连接在了哪个USB口?

# lsusb -t
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 480M
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/10p, 5000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/16p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/7p, 480M
        |__ Port 1: Dev 4, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 2: Dev 5, If 0, Class=Hub, Driver=hub/4p, 480M
            |__ Port 3: Dev 11, If 0, Class=Hub, Driver=hub/4p, 480M
            |__ Port 1: Dev 8, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 3: Dev 6, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 4: Dev 7, If 0, Class=Hub, Driver=hub/4p, 480M
            |__ Port 2: Dev 10, If 2, Class=Audio, Driver=snd-usb-audio, 480M
            |__ Port 2: Dev 10, If 0, Class=Video, Driver=uvcvideo, 480M
            |__ Port 2: Dev 10, If 3, Class=Audio, Driver=snd-usb-audio, 480M
            |__ Port 2: Dev 10, If 1, Class=Video, Driver=uvcvideo, 480M
            |__ Port 1: Dev 18, If 1, Class=CDC Data, Driver=cdc_acm, 12M
            |__ Port 1: Dev 18, If 0, Class=Communications, Driver=cdc_acm, 12M
        |__ Port 5: Dev 9, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 6: Dev 12, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 7: Dev 13, If 0, Class=Hub, Driver=hub/4p, 480M
            |__ Port 1: Dev 14, If 3, Class=Audio, Driver=snd-usb-audio, 480M
            |__ Port 1: Dev 14, If 1, Class=Video, Driver=uvcvideo, 480M
            |__ Port 1: Dev 14, If 2, Class=Audio, Driver=snd-usb-audio, 480M
            |__ Port 1: Dev 14, If 0, Class=Video, Driver=uvcvideo, 480M
            |__ Port 3: Dev 15, If 2, Class=Audio, Driver=snd-usb-audio, 480M
            |__ Port 3: Dev 15, If 0, Class=Video, Driver=uvcvideo, 480M
            |__ Port 3: Dev 15, If 3, Class=Audio, Driver=snd-usb-audio, 480M
            |__ Port 3: Dev 15, If 1, Class=Video, Driver=uvcvideo, 480M
            |__ Port 4: Dev 19, If 0, Class=Vendor Specific Class, Driver=ftdi_sio, 12M
    |__ Port 4: Dev 3, If 0, Class=Human Interface Device, Driver=usbhid, 12M

/dev/ttyUSB 和 /dev/ttyACM的区别

以下内容参考:/dev/ttyUSB 和 /dev/ttyACM的区别? - 知乎

为什么有些 USB 设备在插入主机时使用 /dev/ttyUSB0(或 1……n)而有的 /dev/ttyACM0(或 1……n),在这两种情况下,它们似乎都通过 USB 充当 UART 设备(类似于 RS-232)?为什么微控制器的示例 USB 固件总是以 /dev/ttyACM0 之类的名称结束,而从不以 /dev/ttyUSB0 结尾?

什么是ttyACM?

USB 实施者论坛组织已经描述了符合通信设备类 (CDC) 的设备应如何将自己呈现给 USB 主机。 USB 实现者论坛还指定了 CDC 子类应如何操作,包括那些旨在通过公共交换电话网络 (PSTN) 相互通信的设备。这些被称为调制解调器,因为数据在发送端经过调制操作,将比特转换为可以通过电话线传输的模拟信号,然后通过接收端的解调操作将模拟信号转换回原始位。

要与调制解调器交互,主机 USB 驱动程序必须使用现有控制模型之一。例如,直接线路控制模型控制主机和调制解调器之间如何通过音频类接口交换数据,主机负责调制、解调、数据压缩(如V.42bis)和纠错(如如 V.42)。这种模型被一些USB软调制解调器使用,它们非常便宜,因为它们大多包含一个DSP芯片和一些放大和线路适配层。

另一个控制模型,恰当地命名为抽象控制模型或 ACM,让调制解调器硬件执行模拟功能,并要求它支持 ITU V.250(以前也称为 Hayes)命令集,无论是在数据流或作为单独的控制流通过通信类接口。当命令与数据流中的数据复用时,诸如 Hayes 302(也称为“1 sec +++ 1 sec”)或 TIES(没人记得)之类的转义序列必须允许主机将调制解调器放入命令模式。

在需要通过 USB 与计算机交换数据的支持 USB 的嵌入式微控制器上进行开发时,很容易使用几乎所有操作系统都支持的标准化通信方式。这就是为什么大多数人选择使用 ACM 实现 CDC/PSTN(您是否注意到 /dev/ttyACM0 的 Linux 内核驱动程序名为 cdc_acm?),因为它是交换原始数据的最简单方法。

但是强制性的 V.250 命令集呢?它几乎从未在此类设备中实现,但由于主机没有理由自行生成 V.250 命令,因此设备将永远不必回答它们。假装嵌入式设备是调制解调器,是与其通信的最简单方式,即使它可能永远不会执行任何调制或解调任务。 Linux 不会知道该设备在撒谎,而是将其显示为 /dev/ttyS0。

注:

CDC:Communication Device Class,通信设备类。

ACM:Abstract Control Model,抽象控制模型。

什么是ttyUSB?

有时,嵌入式微控制器不带有硬件 USB 接口。虽然可以使用纯软件 USB 堆栈,但 CPU 的额外限制和通常较小的存储空间通常会导致电路板设计人员包含专用的 UART 转 USB 桥接器。一些供应商,例如 FTDI 或 Prolific,以几欧元的价格出售专用芯片。

这些供应商选择不向主机撒谎(让芯片宣布自己是 USB 调制解调器,而实际上它们不是)。每个供应商都定义了自己的(通常是专有的)协议,其中的命令允许控制芯片的功能,例如设置波特率或控制用于实现硬件流控制的附加信号。

如果可行,Linux 会将具有相似功能的设备分组到相同的默认设备或接口名称下。例如,用户计算机上的 UART(如果有)将被命名为 /dev/ttyS0 和 /dev/ttyS1,即使其中一个是传统的 16550 芯片,另一个是 MAX3100 SPI 控制的 UART。同样,提供 UART-over-USB 功能的设备被命名为 /dev/ttyUSB0、/dev/ttyUSB1 等,即使它们实际上使用不同的设备驱动程序。

总结

因此,当你看到 /dev/ttyACM0 弹出时,您可以尝试将转义序列后跟 AT 命令发送给它,但很有可能该设备只是伪装成调制解调器,并且很乐意将这些字符发送到核心应用程序甚至没有考虑拦截它们。 如果它是 /dev/ttyS0,不要尝试,除非 USB-UART 桥后面的设备自己理解这些命令(XBee 芯片就是这种情况)。