Bagaimana cara me-restart ttyusb *

12

Saya memiliki dua perangkat yang terus menerus memasukkan data melalui ttyUSB0 dan ttyUSB1. Saya memiliki skrip php yang menggunakan data ini. Masalah yang saya hadapi adalah kadang-kadang umpannya membeku. Cara terbaik yang saya lihat untuk memperbaikinya adalah mencabut papan BUB dari komputer dan pasang kembali. Namun, saya mencari cara untuk mengotomatiskan tindakan ini. Apakah ada cara untuk memberitahu linux untuk mengeluarkan papan BUB dan kemudian mengambilnya kembali?

emilyk
sumber
1
Coba solusi di utas lainnya ini: stackoverflow.com/questions/21580750/...

Jawaban:

11

Saya mengalami masalah yang sama seperti Anda tetapi dalam konteks yang berbeda (saya membuka konsol serial pada kotak linux). Tautan serial kadang menjadi tidak responsif dan saya harus mencabut konverter USB-serial secara fisik.

Di bawah ini sepertinya menyelesaikan masalah saya, tetapi tidak selalu.

  1. Temukan driver yang terkait dengan perangkat ttyUSBx Anda.

    [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
    

    Anda dapat melihat itu /dev/ttyUSBmenggunakan usbserial. Sekarang gali lebih jauh:

    [my-pc] # lsmod | grep usbserial

      usbserial              37173  1 pl2303
    

    Dalam kasus saya, konverter USB-ke-serial saya adalah PL2303 Prolific. Jika Anda memiliki adaptor FTDI, saya pikir Anda harus melihat ftdi_siobukan pl2303.

  2. Bongkar driver

    sudo modprobe -r pl2303 #atau nama yang cocok dengan konfigurasi Anda

    sudo modprobe -r usbserial

  3. Muat ulang driver

    sudo modprobe pl2303 #atau nama yang cocok dengan konfigurasi Anda

  4. Luncurkan kembali komunikasi serial Anda

sdive
sumber
Saya mencoba itu, dan semuanya sama pada sistem saya seperti yang Anda gambarkan. Namun, ketika saya mengikuti langkah 2, dikatakan "FATAL: Modul usbserial sedang digunakan." dan tidak akan membiarkan saya menonaktifkannya. Ada ide?
emilyk
1
Saya mencoba mencari cara untuk mendefinisikan perangkat / proses apa yang menggunakan modul usbserial tanpa hasil. Bisakah Anda mencoba "rmmod --force usbserial"?
sdive
7

Dengan jawaban sdive saya terus mendapatkan "FATAL: Modul usbserial sedang digunakan."

Saya akhirnya memecahkan masalah dengan beberapa bimbingan dari jawaban LiLo di sini: /ubuntu//a/661/379851

Tapi alih-alih menggunakan beberapa kode C, saya menulis python yang setara yang juga menemukan bus dan perangkat yang dimaksud:

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

Simpan saja ini sebagai reset_usb.py atau apalah dan jalankan seperti ini:

sudo python reset_usb.py driver_name

Di mana driver_name adalah output dari

lsmod | grep usbserial

Dalam kasus saya, itu adalah cp210x, jadi saya jalankan seperti ini:

sudo python reset_usb.py cp210x
Peter
sumber
Apakah benar-benar perlu untuk ioctl (f, USBDEVFS_RESET, 0) perangkat yang sesuai di / dev / bus / usb / xxx / yyy? Tidakkah cukup dengan membiarkan aplikasi menutup () dan membuka () perangkat / dev / ttyUSBx ketika mendeteksi bahwa data tidak lagi tiba?
Per Lindberg
1

Inilah jawaban saya untuk modul ftdi_sio. Langkah-langkah diadaptasi dari jawaban di atas dan tautan dari komentar di pertanyaan awal.

Saya tidak bisa menghapus modul:

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

Jadi saya menggunakan trik berikut:

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

Yang memang diverifikasi oleh:

% 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

Maka mudah untuk menghapus modul:

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

Dan kemudian secara sederhana:

# modprobe ftdi_sio

Ini tidak jelas mengapa ftdi_sio dalam kondisi buruk, mungkin masih bug seperti di:

Tetapi sepertinya kernel 4.9.20 masih mengandung ftdi_siomodul yang buruk .

malat
sumber