【问题标题】:Disconnect and reconnect ttyUSB0 programmatically in Linux在 Linux 中以编程方式断开和重新连接 ttyUSB0
【发布时间】:2014-02-05 15:01:36
【问题描述】:

尝试解决this problem(ttyUSB0 可以正常工作而不是在大约 1 小时后停止工作)我正在考虑断开并重新连接 USB 设备是否是一个很好的解决方法。

那么,是否可以切断 USB 设备的电源并以编程方式重新启动它(bash)?

# lsusb -t                                        
1-1:1.0: No such file or directory                                              
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=musb-hdrc/1p, 480M             
    |__ Port 1: Dev 2, If 0, Class=vend., Driver=, 12M                          
    |__ Port 1: Dev 2, If 1, Class=vend., Driver=cp210x, 12M

在 am335x 上,内核 3.2.0,ubuntu 内核 armhf。

[    1.784332] usb 1-1: cp210x converter now attached to ttyUSB0

目前我需要一个完整的电源循环才能恢复 ttyUSB0

【问题讨论】:

  • 如果您找到自己问题的解决方案,您应该发布答案。如果没有人提供更好的答案,您甚至可以接受自己的答案。

标签: linux bash serial-port tty


【解决方案1】:

这是解决方案:

  • 查找您的 USB 设备的身份。

    # tree /sys/bus/usb/drivers/cp210x/
    /sys/bus/usb/drivers/cp210x/
    |-- 1-1:1.1 -> ../../../../devices/platform/omap/musb-ti81xx/musb-hdrc.1/usb1/1-1/1-1:1.1
    |-- bind
    |-- module -> ../../../../module/cp210x
    |-- remove_id
    |-- uevent
     -- unbind
    

所以1-1:1.1 是我的ttyUSB0 的标识符(也可以通过dmesg 发现)。

  • 然后,断开设备(以 root 身份):

    # echo -n "1-1:1.1" > /sys/bus/usb/drivers/cp210x/unbind
    
  • 重新连接

    # echo -n "1-1:1.1" > /sys/bus/usb/drivers/cp210x/bind
    

此时我有相同的设备,但名称不同,它现在是 ttyUSB1 而不是 ttyUSB0。 - 为了避免这种情况,我在/etc/udev/rules.d/ 中添加了一条新规则,方法是使用以下行创建一个名为99-usb-serial.rules 的新文件:

SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea70", ATTRS{serial}=="002DCFAF", SYMLINK+="sameName", MODE:="0666"

其中idVendoridProduct 和serial 必须是您设备的值。此规则将创建一个名为sameName 的新设备,该设备链接到通常从操作系统生成的ttyUSB* 设备。

【讨论】:

  • 从 dmesg 获取我的设备标识符我使用这个:dmesg | grep ': pl2303 converter detected' |sed -e '$!d'| awk '{ print $2}'|sed 's/.$//'
  • 但这不行,关闭USB串口设备?如何关闭 USB 串口
【解决方案2】:

正如@Robert Harvey 所说,

您首先需要找到我们的驱动程序,该驱动程序将帮助您“拔出和插入”USB。输入:ls /sys/bus/usb/drivers,应该打印出类似这样的内容:btusb ftdi_sio hub usb usbfs usbhid usbserial_generic uvcvideo。这些是每个 USB 设备的所有驱动程序。现在,假设我的是ftdi_sio,这是我用来编程我的arduino(atmega328p 芯片)的设备。我不确定您/其他 USB 设备是如何在那里命名的。就像,我不知道其中哪一个是我的鼠标。 现在,您可以使用以下命令查看驱动程序的命令: ls /sys/bus/usb/drivers/ftdi_sio/,将打印如下内容:1-4:1.0 bind module uevent unbind,其中1-4:1.0 是设备的特征代码,bindunbind 命令分别是“插入”和“拔出”命令。

现在,如果我想以编程方式拔出 ftdi usb 端口,我将输入: echo -n "1-4:1.0" > /sys/bus/usb/drivers/ftdi_sio/unbind 并且,再次插入: echo -n "1-4:1.0" > /sys/bus/usb/drivers/ftdi_sio/bind

现在,我们可以将所有命令组合在一起,使用 ';':

echo -n "1-4:1.0" > /sys/bus/usb/drivers/ftdi_sio/unbind ; echo -n "1-4:1.0" > /sys/bus/usb/drivers/ftdi_sio/bind

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    相关资源
    最近更新 更多