将串口设备地址绑定到特定的USB端口

将串口设备地址绑定到特定的USB端口

我的操作系统:Raspbian Stretch Lite

太长;博士;

  1. 我有 2 个相同的 USB 设备
  2. 我想确保他们的地址不会混淆
  3. 我的想法是将地址绑定到特定的USB端口。我可以“牺牲”端口
  4. 由于我是linux新手,所以不知道该怎么做。据我所知,udev 通过 ID 来区分设备,而不是端口(不同的制造商、型号等)
  5. 还有其他推荐的方法吗?

长版:
因此,我拥有同一制造商的 UART 至 USB 转换器,因此它在 udev 中具有相同的 ID 等。我想确保这两个设备不会混淆。例如,/dev/ttyUSB0 将始终指向我想要的特定硬件(例如:内部。这两个设备将由一扇门隔开,因此不要混淆外部和内部非常重要)。

我不知道如何实现这一点。我的想法是绑定特定端口,以便当设备插入这些特定端口时,它总是将地址 ttyUSB0 提供给该设备。有可能这样做吗?我是linux新手,我知道有udev规则。但据我所知,它只通过设备的 ID 绑定设备,而不是端口。或者还有其他推荐的方法来使用 udev 来做到这一点吗?

这是我的udevadm设备:

  looking at device '/devices/pci0000:00/0000:00:14.0/usb3/3-2/3-2:1.0/ttyUSB0/tty/ttyUSB0':
    KERNEL=="ttyUSB0"
    SUBSYSTEM=="tty"
    DRIVER==""

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb3/3-2/3-2:1.0/ttyUSB0':
    KERNELS=="ttyUSB0"
    SUBSYSTEMS=="usb-serial"
    DRIVERS=="cp210x"
    ATTRS{port_number}=="0"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb3/3-2/3-2:1.0':
    KERNELS=="3-2:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="cp210x"
    ATTRS{authorized}=="1"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceClass}=="ff"
    ATTRS{bInterfaceNumber}=="00"
    ATTRS{bInterfaceProtocol}=="00"
    ATTRS{bInterfaceSubClass}=="00"
    ATTRS{bNumEndpoints}=="02"
    ATTRS{interface}=="CP2102 USB to UART Bridge Controller"
    ATTRS{supports_autosuspend}=="1"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb3/3-2':
    KERNELS=="3-2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{bMaxPower}=="100mA"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bcdDevice}=="0100"
    ATTRS{bmAttributes}=="80"
    ATTRS{busnum}=="3"
    ATTRS{configuration}==""
    ATTRS{devnum}=="57"
    ATTRS{devpath}=="2"
    ATTRS{idProduct}=="ea60"
    ATTRS{idVendor}=="10c4"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="Silicon Labs"
    ATTRS{maxchild}=="0"
    ATTRS{product}=="CP2102 USB to UART Bridge Controller"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="removable"
    ATTRS{serial}=="0001"
    ATTRS{speed}=="12"
    ATTRS{urbnum}=="1909"
    ATTRS{version}==" 1.10"

注意:如果将端口绑定到特定的串行地址意味着我无法将该端口用于任何其他设备,那么这对我来说没问题

答案1

您可以直接使用存储在和udev中的值,而不是尝试根据路径来修复路径名/dev/serial/by-path/dev/serial/by-id

这些是ttyUSB设备的符号链接,只要发现设备就会更新。

例如在我的机器上:

% ls -l /dev/serial/by-path/
total 0
lrwxrwxrwx 1 root root 13 Dec 12 19:23 pci-0000:00:1a.0-usb-0:1.5.1:1.0-port0 -> ../../ttyUSB0
lrwxrwxrwx 1 root root 13 Dec 12 19:23 pci-0000:00:1a.0-usb-0:1.5.1:1.1-port0 -> ../../ttyUSB1
lrwxrwxrwx 1 root root 13 Dec  9 10:56 pci-0000:00:1a.0-usb-0:1.5.2:1.0-port0 -> ../../ttyUSB4
lrwxrwxrwx 1 root root 13 Dec 12 19:23 pci-0000:00:1a.0-usb-0:1.5.4:1.0-port0 -> ../../ttyUSB2
lrwxrwxrwx 1 root root 13 Dec 12 19:23 pci-0000:00:1a.0-usb-0:1.5.4:1.1-port0 -> ../../ttyUSB3
lrwxrwxrwx 1 root root 13 Dec 12 19:24 pci-0000:00:1a.0-usb-0:1.6:1.0-port0 -> ../../ttyUSB5

% ls -l /dev/serial/by-id/  
total 0
lrwxrwxrwx 1 root root 13 Dec  9 10:56 usb-1a86_USB2.0-Ser_-if00-port0 -> ../../ttyUSB4
lrwxrwxrwx 1 root root 13 Dec 12 19:24 usb-1a86_USB2.0-Serial-if00-port0 -> ../../ttyUSB5
lrwxrwxrwx 1 root root 13 Dec 12 19:23 usb-utek_USB__-__Serial_Cable_FTVW64JR-if00-port0 -> ../../ttyUSB0
lrwxrwxrwx 1 root root 13 Dec 12 19:23 usb-utek_USB__-__Serial_Cable_FTVW64JR-if01-port0 -> ../../ttyUSB1
lrwxrwxrwx 1 root root 13 Dec 12 19:23 usb-utek_USB__-__Serial_Cable_FTWKU6FP-if00-port0 -> ../../ttyUSB2
lrwxrwxrwx 1 root root 13 Dec 12 19:23 usb-utek_USB__-__Serial_Cable_FTWKU6FP-if01-port0 -> ../../ttyUSB3

答案2

尝试https://unix.stackexchange.com/a/533464/202850。我有四台相同的相机,没有序列号,需要确定它们。我是通过USB端口完成的

相关内容