在Linux中以编程方式断开和重新连接ttyUSB0

8

尝试解决此问题(ttyUSB0正常工作然后在约1小时后停止工���),我考虑是否断开并重新连接usb设备可能是一个不错的修复方式。

因此,能否通过程序(bash)切断USB设备的电源并重新上电呢?

# 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 core armhf系统。

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

目前,我需要完整的电源循环才能重新使用 ttyUSB0


1
如果您找到了自己问题的解决方案,应该发布一个答案。如果没有人提供更好的答案,您甚至可以接受自己的答案。 - OJFord
2个回答

16

这是解决方案:

  • 找到您的 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和序列号必须是您设备的值。此规则将创建一个名为sameName的新设备,链接到从操作系统通常生成的ttyUSB*设备。


    1
    要从dmesg获取我的设备标识符,我使用以下命令:dmesg | grep ': pl2303 converter detected' |sed -e '$!d'| awk '{ print $2}'|sed 's/.$//' - snex
    但这并不会关闭USB串口设备?如何关闭USB串口? - 3bu1

    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

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接