如何重新启动 ttyusb*

emi*_*lyk 12 linux usb tty

我有两个设备通过 ttyUSB0 和 ttyUSB1 连续馈送数据。我有使用这些数据的 php 脚本。我遇到的问题是有时饲料会冻结。我见过的解决此问题的最佳方法是从计算机上拔下 BUB 板并重新插入。但是,我正在寻找一种方法来自动执行此操作。有没有办法告诉 linux 基本上弹出 BUB 板,然后以某种方式再次拿起它?

sdi*_*ive 11

我和你有同样的问题,但在不同的上下文中(我在 linux 机器上打开了一个串行控制台)。串行链路有时会变得无响应,我必须物理拔下 USB 串行转换器。

以下似乎解决了我的问题,但并非总是如此。

  1. 找到与您的 ttyUSBx 设备关联的驱动程序。

    [my-pc]# cat /proc/tty/drivers

    /dev/tty             /dev/tty        5       0 system:/dev/tty
    /dev/console         /dev/console    5       1 system:console
    /dev/ptmx            /dev/ptmx       5       2 system
    /dev/vc/0            /dev/vc/0       4       0 system:vtmaster
    rfcomm               /dev/rfcomm   216 0-255 serial
    usbserial            /dev/ttyUSB   188 0-253 serial
    ttyprintk            /dev/ttyprintk   5       3 console
    serial               /dev/ttyS       4 64-111 serial
    pty_slave            /dev/pts      136 0-1048575 pty:slave
    pty_master           /dev/ptm      128 0-1048575 pty:master
    unknown              /dev/tty        4 1-63 console
    
    Run Code Online (Sandbox Code Playgroud)

    你可以看到/dev/ttyUSB使用usbserial. 现在进一步挖掘:

    [我的电脑]# lsmod | grep usbserial

      usbserial              37173  1 pl2303
    
    Run Code Online (Sandbox Code Playgroud)

    就我而言,我的 USB 转串口转换器是 Prolific PL2303。如果您有 FTDI 适配器,我认为您应该看到ftdi_sio而不是pl2303.

  2. 卸载驱动程序

    sudo modprobe -r pl2303 #或与您的配置匹配的名称

    须藤 modprobe -r usbserial

  3. 重新加载驱动

    sudo modprobe pl2303 #或与您的配置匹配的名称

  4. 重新启动您的串行通信


小智 7

随着 sdive 的回答,我不断收到“致命:模块 usbserial 正在使用中”。

我终于通过 LiLo 的回答的一些指导解决了这个问题:https : //askubuntu.com/a/661/379851

但是我没有使用一些 C 代码,而是编写了一个 Python 等效代码,它也可以找到有问题的总线和设备:

#!/usr/bin/env python
import os
import sys
from subprocess import Popen, PIPE
import fcntl
driver = sys.argv[-1]
print "resetting driver:", driver
USBDEVFS_RESET= 21780

try:
    lsusb_out = Popen("lsusb | grep -i %s"%driver, shell=True, bufsize=64, stdin=PIPE, stdout=PIPE, close_fds=True).stdout.read().strip().split()
    bus = lsusb_out[1]
    device = lsusb_out[3][:-1]
    f = open("/dev/bus/usb/%s/%s"%(bus, device), 'w', os.O_WRONLY)
    fcntl.ioctl(f, USBDEVFS_RESET, 0)
except Exception, msg:
    print "failed to reset device:", msg
Run Code Online (Sandbox Code Playgroud)

只需将其保存为 reset_usb.py 或其他内容,然后像这样运行它:

sudo python reset_usb.py driver_name
Run Code Online (Sandbox Code Playgroud)

其中 driver_name 是输出

lsmod | grep usbserial
Run Code Online (Sandbox Code Playgroud)

就我而言,它是 cp210x,所以我像这样运行它:

sudo python reset_usb.py cp210x
Run Code Online (Sandbox Code Playgroud)