Linux 绑定USB设备端口

1 根据设备ID绑定

方法特点:按照ID绑定的话不需要固定USB接口,它是根据设备自身的ID进行绑定,但是如果有多个设备的串口使用同一款串口芯片的话,会出现紊乱

查看需要绑定的设备的idVendoridpProduct,例如我要绑定一个rplidar的激光雷达

$ lsusb

在这里插入图片描述
新建一个规则文件:

$ sudo gedit /etc/udev/rules.d/com_rplidar.rules

自定义打开文件写入自定义规则。这里最好新建一个文件,不要覆盖以前的文件了。如果是相同设备还需要额外的辨别参数也可以添加额外的参数。我们只取前面的数值10c4ea60,,后面的描述不要。

KERNEL=="ttyUSB*" , ATTRS{idVendor}=="10c4",ATTRS{idProduct}=="ea60",MODE:="0777" ,SYMLINK+="ttyRplidar"

然后使其作用:

$ sudo udevadm trigger

查看是否成功

$ ls -l /dev/ttyRplidar 
lrwxrwxrwx 1 root root 7 Nov 12 22:22 /dev/ttyRplidar -> ttyUSB0

或者

ls /dev/tty*

在这里插入图片描述
如图,可以看到新增了一个设备,正是我们在规则文件中设置的别名。

如果不行的话先检测规则文件的格式有没有错误,接着将USB拔了再重插。

还有其他额外的设备需要则加一行,方法一样。

2 根据电脑USB硬件端口绑定,只要插入该USB端口即为设定设备名

方法特点:按照USB硬件ID绑定的话必须固定接口对应的设备,因为它只根据电脑自身的USB硬件地址确定,但是它可以解决设备使用同一款串口芯片导致ID相同的问题

有时候我们两个串口设备使用了痛苦的USB芯片,例如激光雷达和机械臂使用了同款的USB芯片,在终端中输入

$ lsusb

会发现两者的USB端口的VID和PID是相同的(10c4:ea60),所以开启了机械臂后,激光雷达启动时会指向到机械臂的端口。

将USB设备的接入的端口进行名称绑定,拔出或关闭USB设备后,在端口中输入

$ ls /dev

再插入或打开USB设备,输入

$ ls /dev

找到USB设备的名称(确定当前各个设备的串口名字,如机械臂是ttyUSB1,激光雷达是ttyUSB0),然后输入

$ udevadm info --attribute-walk --name=/dev/ttyUSB1

可以看到

...
looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2.4/1-2.4.4/1-2.4.4:1.0/ttyUSB1/tty/ttyUSB1':
    KERNEL=="ttyUSB1"
    SUBSYSTEM=="tty"
    DRIVER==""
  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/ 1-2/1-2.4/1-2.4.4/1-2.4.4:1.0/ttyUSB1':
    KERNELS=="ttyUSB1"
    SUBSYSTEMS=="usb-serial"
    DRIVERS=="cp210x"
    ATTRS{port_number}=="0"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/ 1-2/1-2.4/1-2.4.4/1-2.4.4:1.0':
    KERNELS=="1-2.4.4: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"
    ...

可以得知该设备现在使用的端口号为“1-2.4.4:1.0”,接下来开始编写绑定规则

$ sudo gedit /etc/udev/rules.d/ttyUSBLink.rules

在文件中添加

ACTION=="add",KERNELS=="1-2.4.4:1.0",SUBSYSTEMS=="usb",MODE:="0777", SYMLINK+="rplidar"

保存文件并重启PC,在终端中输入

$ ls -l /dev |grep ttyUSB

查看是否成功修改
在这里插入图片描述
注意:因为是绑定固定的端口,所以usb的接口不能随意更换位置,考虑以后在HUB上标注各个位置插的设备。

### 启用 Linux 中被禁用的 USB 端口 在某些情况下,Linux 系统中的 USB 端口可能会因为硬件问题、驱动冲突或其他原因而被禁用。以下是针对此问题的一些解决方案: #### 方法一:通过 `dmesg` 查找错误日志并解决问题 当 USB 端口被禁用时,通常会在系统的内核消息中记录相关信息。可以通过运行以下命令查看最近的日志: ```bash dmesg | grep -i usb ``` 如果发现类似 `usb usb1-port2: disabled by hub (EMI?), re-enabling...` 的警告信息,则可能是因为电磁干扰(EMI)导致端口被禁用[^3]。 此时可以尝试手动重新启用该端口。具体操作如下: 1. 找到对应端口的编号(例如 `usb1-port2`)。 2. 使用以下命令强制重启 USB 子系统: ```bash echo '1-2' | sudo tee /sys/bus/usb/drivers/usb/unbind sleep 1 echo '1-2' | sudo tee /sys/bus/usb/drivers/usb/bind ``` 这里的 `1-2` 是指代具体的 USB 设备路径,需根据实际环境调整。 #### 方法二:处理特定错误提示 对于像 `usb2-port3: Cannot enable. Maybe the USB cable is bad?` 这样的错误,可能是由于电缆质量差或者连接不稳定引起的[^2]。建议采取以下措施: - 更换高质量的 USB 数据线; - 尝试更换不同的 USB 接口; - 如果是台式机,可考虑直接插拔设备来触发新的扫描过程。 #### 方法三:利用 HUB 驱动机制恢复端口功能 USB Hub 的工作流程涉及多个事件回调函数,如 `hub_event->port_event->hub_port_connect_change->hub_port_connect`[^4]。这些内部调用决定了端口的状态变化逻辑。因此,也可以借助以下方法重置整个 HUB 来修复异常状态: ```bash for i in $(ls /sys/class/udc); do echo "" > "/sys/class/udc/$i/softconnect" done sleep 2 for i in $(ls /sys/class/udc); do echo "1" > "/sys/class/udc/$i/softconnect" done ``` 以上脚本会暂时断开所有 UDC 控制器链接然后再重建它们之间的通信链路,从而达到刷新目的。 #### 方法四:编辑 GRUB 参数临时加载模块支持 有时需要额外指定启动参数才能让操作系统正常检测外设资源。比如遇到 CentOS 安装过程中无法识别存储介质的情况时,可以在引导菜单处按下键进入编辑模式,并追加相关选项至 kernel line 上面去实现动态加载必要的驱动程序集: ``` inst.stage2=hd:/dev/sdb1 rhgb quiet modprobe.blacklist=xhci_pci,xhci_hcd ehci-hcd uhci_hcd ohci_hcd ``` 注意替换 `/dev/sdb1` 成真实的目标分区名称即可完成设置动作。 --- ### 总结 上述几种方式分别适用于不同场景下的 USB 故障排查与解决策略。无论是简单的物理层面维护还是深入底层架构分析都能有效提升成功率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值