Cách khởi động lại ttyusb *


12

Tôi có hai thiết bị liên tục cung cấp dữ liệu thông qua ttyUSB0 và ttyUSB1. Tôi có các tập lệnh php đang sử dụng dữ liệu này. Vấn đề tôi gặp phải là đôi khi thức ăn chỉ đóng băng. Cách tốt nhất tôi từng thấy để khắc phục điều này là rút phích cắm bảng BUB khỏi máy tính và cắm lại. Tuy nhiên, tôi đang tìm cách để tự động hóa hành động này. Có cách nào để nói với linux về cơ bản đẩy bảng BUB và sau đó bằng cách nào đó chọn lại nó không?


1
Hãy thử giải pháp trong chủ đề khác này: stackoverflow.com/questions/21580750/

Câu trả lời:


11

Tôi đang gặp vấn đề tương tự như bạn nhưng trong một bối cảnh khác (tôi mở bảng điều khiển nối tiếp trên hộp linux). Liên kết nối tiếp đôi khi trở nên không phản hồi và tôi phải rút phích cắm bộ chuyển đổi nối tiếp USB.

Dưới đây dường như để giải quyết vấn đề của tôi, nhưng không phải lúc nào cũng vậy.

  1. Tìm trình điều khiển liên quan đến thiết bị ttyUSBx của bạn.

    [my-pc] # cat / Proc / tty / trình điều khiển

    /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
    

    Bạn có thể thấy rằng /dev/ttyUSBsử dụng usbserial. Bây giờ đào thêm một chút:

    [máy tính của tôi] # lsmod | grep usbserial

      usbserial              37173  1 pl2303
    

    Trong trường hợp của tôi, bộ chuyển đổi USB nối tiếp của tôi là Prolific PL2303. Nếu bạn có bộ điều hợp FTDI, tôi nghĩ bạn nên xem ftdi_siothay vì pl2303.

  2. Dỡ tài xế

    sudo modprobe -r pl2303 # hoặc tên phù hợp với cấu hình của bạn

    sudo modprobe -r usbserial

  3. Tải lại trình điều khiển

    sudo modprobe pl2303 # hoặc tên phù hợp với cấu hình của bạn

  4. Khởi chạy lại giao tiếp nối tiếp của bạn


Tôi đang thử điều đó và mọi thứ đều giống nhau trên hệ thống của tôi như bạn mô tả. Tuy nhiên, khi tôi làm theo bước 2, nó báo "FATAL: Module usbserial đang được sử dụng." và sẽ không để tôi vô hiệu hóa nó. Có ý kiến ​​gì không?
emilyk

1
Tôi đã cố gắng tìm cách xác định thiết bị / quy trình nào sử dụng mô-đun usbserial mà không thành công. Bạn có thể thử "rmmod - Force usbserial" không?
sdive

7

Với câu trả lời của sdive, tôi tiếp tục nhận được "FATAL: Module usbserial đang được sử dụng."

Cuối cùng tôi cũng đã giải quyết được vấn đề với một số hướng dẫn từ câu trả lời của LiLo tại đây: https://askubfox.com/a/661/379851

Nhưng thay vì sử dụng một số mã C, tôi đã viết một con trăn tương đương cũng tìm thấy xe buýt và thiết bị được đề cập:

#!/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

Chỉ cần lưu cái này dưới dạng reset_usb.py hoặc một cái gì đó và sau đó chạy nó như thế này:

sudo python reset_usb.py driver_name

Driver_name là đầu ra từ đâu

lsmod | grep usbserial

Trong trường hợp của tôi, nó là cp210x, vì vậy tôi chạy nó như thế này:

sudo python reset_usb.py cp210x

Có thực sự cần thiết cho ioctl (f, USBDEVFS_RESET, 0) thiết bị tương ứng trên / dev / bus / usb / xxx / yyy không? Không đủ chỉ để cho ứng dụng đóng () và mở () thiết bị / dev / ttyUSBx khi phát hiện dữ liệu đó không còn đến nữa?
Per Lindberg

1

Đây là câu trả lời của tôi cho các mô-đun ftdi_sio. Các bước được điều chỉnh từ câu trả lời trên và liên kết từ một nhận xét trong câu hỏi ban đầu.

Tôi không thể xóa mô-đun:

% 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.

Vì vậy, tôi sử dụng thủ thuật sau:

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

Mà thực sự đã được xác minh bởi:

% 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

Sau đó, thật dễ dàng để loại bỏ các mô-đun:

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

Và sau đó đơn giản là:

# modprobe ftdi_sio

Điều này không rõ tại sao ftdi_sio có hình dạng xấu như vậy, có thể vẫn là lỗi như trong:

Nhưng có vẻ như kernel 4.9.20 vẫn chứa ftdi_siomô-đun xấu .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.