Answers:
我遇到了与你相同的问题,但是在不同的环境中(我在linux机器上打开一个串行控制台)。串行链路有时会无响应,我必须拔掉USB串口转换器。
以下似乎解决了我的问题,但并非总是如此。
找到与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
。
卸载驱动程序
sudo modprobe -r pl2303#或与您的配置匹配的名称
sudo modprobe -r usbserial
重新加载驱动程序
sudo modprobe pl2303#或与您的配置匹配的名称
重新启动串行通信
随着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
这是我对模块的回答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
模块。