如何重启ttyusb *


12

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


1
尝试在另一个线程中的解决方案:stackoverflow.com/questions/21580750 / ...

Answers:


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
    

    你可以看到它的/dev/ttyUSB用途usbserial。现在再挖一点:

    [my-pc] #lsmod | grep usbserial

      usbserial              37173  1 pl2303
    

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

  2. 卸载驱动程序

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

    sudo modprobe -r usbserial

  3. 重新加载驱动程序

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

  4. 重新启动串行通信


我正在尝试,我的系统上的一切都和你描述的一样。但是,当我按照第2步时,它说“致命:模块usbserial正在使用中”。并且不会让我禁用它。有任何想法吗?
emilyk 2013年

1
我试图找到一种方法来定义哪个设备/进程使用usbserial模块但没有成功。你能试试“rmmod --force usbserial”吗?
sdive 2013年

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

只需将其保存为reset_usb.py或其他内容,然后运行如下:

sudo python reset_usb.py driver_name

其中driver_name是输出

lsmod | grep usbserial

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

sudo python reset_usb.py cp210x

是否真的有必要ioctl(f,USBDEVFS_RESET,0)/ dev / bus / usb / xxx / yyy上的相应设备?仅当让应用程序在检测到数据不再到达时关闭()并打开()/ dev / ttyUSBx设备是不够的?
Per Lindberg 2017年

1

这是我对模块的回答ftdi_sio。步骤根据上述答案和原始问题中的评论链接进行调整。

我无法删除模块:

% sudo rmmod ftdi_sio
rmmod: ERROR: Module ftdi_sio is in use
% sudo modprobe -r ftdi_sio
modprobe: FATAL: Module ftdi_sio is in use.

所以我使用以下技巧:

% sudo dmesg | grep ttyUSB0
[    4.784615] usb 3-2.4: FTDI USB Serial Device converter now attached to ttyUSB0

确实通过以下方式验证了:

% tree /sys/bus/usb/drivers/ftdi_sio     
/sys/bus/usb/drivers/ftdi_sio
├── 3-2.4:1.0 -> ../../../../devices/pci0000:00/0000:00:14.0/usb3/3-2/3-2.4/3-2.4:1.0
├── bind
├── module -> ../../../../module/usbserial
├── uevent
└── unbind

2 directories, 3 files

然后很容易删除模块:

# echo -n "3-2.4:1.0"  > /sys/bus/usb/drivers/ftdi_sio/unbind
# rmmod ftdi_sio 
# rmmod usbserial 

然后简单地说:

# modprobe ftdi_sio

目前还不清楚为什么ftdi_sio处于如此糟糕的状态,可能仍然是bug,如:

但似乎内核4.9.20仍然包含坏ftdi_sio模块。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.