Comment redémarrer ttyusb *

12

J'ai deux appareils qui alimentent en continu les données via ttyUSB0 et ttyUSB1. J'ai des scripts php qui utilisent ces données. Le problème que je rencontre est que parfois le flux se fige. La meilleure façon de résoudre ce problème est de débrancher la carte BUB de l'ordinateur et de la rebrancher. Cependant, je cherche un moyen d'automatiser cette action. Existe-t-il un moyen de dire à Linux d'éjecter essentiellement la carte BUB puis de la récupérer?

emilyk
la source
1
Essayez la solution dans cet autre thread: stackoverflow.com/questions/21580750/…

Réponses:

11

J'ai le même problème que vous mais dans un contexte différent (j'ouvre une console série sur une box Linux). La liaison série ne répond parfois plus et je dois débrancher physiquement le convertisseur USB-série.

Ce qui suit semble résoudre mon problème, mais pas toujours.

  1. Recherchez le pilote associé à votre périphérique ttyUSBx.

    [mon-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
    

    Vous pouvez voir cela /dev/ttyUSButilise usbserial. Creusez maintenant un peu plus loin:

    [mon-pc] # lsmod | grep usbserial

      usbserial              37173  1 pl2303
    

    Dans mon cas, mon convertisseur USB-série est un Prolific PL2303. Si vous avez un adaptateur FTDI, je pense que vous devriez voir à la ftdi_sioplace de pl2303.

  2. Déchargez le pilote

    sudo modprobe -r pl2303 #ou le nom qui correspond à votre configuration

    sudo modprobe -r usbserial

  3. Rechargez le pilote

    sudo modprobe pl2303 #ou le nom qui correspond à votre configuration

  4. Relancez votre communication série

plongée
la source
J'essaie, et tout est le même sur mon système que vous décrivez. Cependant, lorsque je suis l'étape 2, il est dit "FATAL: le module usbserial est en cours d'utilisation". et ne me laisse pas le désactiver. Des idées?
emilyk
1
J'essayais de trouver un moyen de définir quel périphérique / processus utilise le module usbserial sans succès. Pouvez-vous essayer "rmmod --force usbserial"?
sdive
7

Avec la réponse de sdive, je n'arrêtais pas d'obtenir "FATAL: le module USB est en cours d'utilisation".

J'ai finalement résolu le problème avec quelques conseils de la réponse de LiLo ici: /ubuntu//a/661/379851

Mais au lieu d'utiliser du code C, j'ai écrit un équivalent python qui trouve également le bus et le périphérique en question:

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

Enregistrez simplement cela sous reset_usb.py ou quelque chose, puis exécutez-le comme ceci:

sudo python reset_usb.py driver_name

Où driver_name est la sortie de

lsmod | grep usbserial

Dans mon cas, c'était cp210x, donc je le lance comme ceci:

sudo python reset_usb.py cp210x
Peter
la source
Faut-il vraiment ioctl (f, USBDEVFS_RESET, 0) le périphérique correspondant sur / dev / bus / usb / xxx / yyy? N'est-ce pas suffisant de laisser l'application fermer () et ouvrir () le périphérique / dev / ttyUSBx lorsqu'elle détecte que les données n'arrivent plus?
Per Lindberg
1

Voici ma réponse pour le module ftdi_sio. Les étapes sont adaptées de la réponse ci-dessus et du lien d'un commentaire dans la question d'origine.

Je n'ai pas pu retirer le module:

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

J'utilise donc l'astuce suivante:

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

Ce qui a en effet été vérifié par:

% 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

Ensuite, il a été facile de retirer le module:

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

Et puis simplement:

# modprobe ftdi_sio

Ce n'est pas clair pourquoi ftdi_sio se met en si mauvais état, peut-être encore un bug comme dans:

Mais il semble que le noyau 4.9.20 contient toujours un mauvais ftdi_siomodule.

malat
la source