Come riavviare ttyusb *


12

Ho due dispositivi che forniscono continuamente dati tramite ttyUSB0 e ttyUSB1. Ho script php che utilizzano questi dati. Il problema in cui mi imbatto è che a volte il feed si blocca. Il modo migliore che ho visto per risolvere questo problema è quello di scollegare la scheda BUB dal computer e ricollegarla. Tuttavia, sto cercando un modo per automatizzare questa azione. C'è un modo per dire a Linux di espellere essenzialmente la scheda BUB e poi in qualche modo riprenderla?


1
Provate la soluzione in questo altro thread: stackoverflow.com/questions/21580750/...

Risposte:


11

Sto riscontrando lo stesso problema, ma in un contesto diverso (apro una console seriale su una scatola di Linux). Il collegamento seriale a volte non risponde e devo scollegare fisicamente il convertitore USB-seriale.

Quanto sotto sembra risolvere il mio problema, ma non sempre.

  1. Trova il driver associato al tuo dispositivo 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
    

    Puoi vedere che /dev/ttyUSBusa usbserial. Ora scava un po 'di più:

    [my-pc] # lsmod | grep usbserial

      usbserial              37173  1 pl2303
    

    Nel mio caso, il mio convertitore da USB a seriale è un Prolific PL2303. Se hai un adattatore FTDI, penso che dovresti vedere ftdi_sioinvece di pl2303.

  2. Scarica il driver

    sudo modprobe -r pl2303 #o il nome che corrisponde alla tua configurazione

    sudo modprobe -r usbserial

  3. Ricarica il driver

    sudo modprobe pl2303 #o il nome che corrisponde alla tua configurazione

  4. Riavvia la comunicazione seriale


Ci sto provando, e tutto è lo stesso sul mio sistema come lo descrivi. Tuttavia, quando seguo il passaggio 2, viene visualizzato il messaggio "FATAL: il modulo utente del modulo è in uso". e non mi permetterà di disabilitarlo. Qualche idea?
emilyk,

1
Stavo cercando di trovare un modo per definire quale dispositivo / processo utilizza senza successo il modulo usbserial. Puoi provare "rmmod --force usbserial"?
sdive,

7

Con la risposta di sdive continuavo a ricevere "FATAL: il modulo usbserial è in uso".

Alla fine ho risolto il problema con alcune indicazioni dalla risposta di LiLo qui: /ubuntu//a/661/379851

Ma invece di usare un po 'di codice C, ho scritto un equivalente di Python che trova anche il bus e il dispositivo in questione:

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

Basta salvarlo come reset_usb.py o qualcosa del genere e quindi eseguirlo in questo modo:

sudo python reset_usb.py driver_name

Da dove driver_name è l'output

lsmod | grep usbserial

Nel mio caso, era cp210x, quindi lo eseguo in questo modo:

sudo python reset_usb.py cp210x

È davvero necessario ioctl (f, USBDEVFS_RESET, 0) il dispositivo corrispondente su / dev / bus / usb / xxx / yyy? Non è sufficiente lasciare che l'applicazione chiuda () e apra () il dispositivo / dev / ttyUSBx quando rileva che i dati non arrivano più?
Per Lindberg,

1

Ecco la mia risposta per il modulo ftdi_sio. I passaggi sono adattati dalla risposta sopra e il collegamento da un commento nella domanda originale.

Non è stato possibile rimuovere il modulo:

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

Quindi uso il seguente trucco:

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

Che in effetti è stato verificato da:

% 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

Quindi è stato facile rimuovere il modulo:

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

E poi semplicemente:

# modprobe ftdi_sio

Questo non è chiaro perché ftdi_sio abbia una cattiva forma, forse sia ancora un bug come in:

Ma sembra che il kernel 4.9.20 contenga ancora un ftdi_siomodulo errato .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.