Ttyusb neu starten *

12

Ich habe zwei Geräte, die kontinuierlich Daten über ttyUSB0 und ttyUSB1 einspeisen. Ich habe PHP-Skripte, die diese Daten verwenden. Das Problem, auf das ich stoße, ist, dass der Feed manchmal einfach einfriert. Das Problem lässt sich am besten beheben, indem Sie die BUB-Platine vom Computer trennen und wieder anschließen. Ich suche jedoch nach einer Möglichkeit, diese Aktion zu automatisieren. Gibt es eine Möglichkeit, Linux anzuweisen, das BUB-Board im Wesentlichen auszuwerfen und es dann irgendwie wieder aufzunehmen?

emilyk
quelle
1
Versuchen Sie die Lösung in diesem anderen Thread: stackoverflow.com/questions/21580750/…

Antworten:

11

Ich habe das gleiche Problem wie Sie, aber in einem anderen Kontext (ich öffne eine serielle Konsole auf einer Linux-Box). Die serielle Verbindung reagiert manchmal nicht mehr und ich muss den USB-Seriell-Konverter physisch trennen.

Das Folgende scheint mein Problem zu lösen, aber nicht immer.

  1. Suchen Sie den Treiber für Ihr ttyUSBx-Gerät.

    [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
    

    Sie können sehen, dass /dev/ttyUSBverwendet usbserial. Jetzt noch etwas weiter graben:

    [my-pc] # lsmod | grep usbserial

      usbserial              37173  1 pl2303
    

    In meinem Fall ist mein USB-Seriell-Wandler ein Prolific PL2303. Wenn Sie einen FTDI-Adapter haben, denke ich, sollten Sie ftdi_siostatt sehen pl2303.

  2. Entladen Sie den Treiber

    sudo modprobe -r pl2303 #oder der Name, der Ihrer Konfiguration entspricht

    sudo modprobe -r usbserial

  3. Laden Sie den Treiber neu

    sudo modprobe pl2303 #oder der Name, der Ihrer Konfiguration entspricht

  4. Starten Sie Ihre serielle Kommunikation neu

Tauchen
quelle
Ich versuche das, und auf meinem System ist alles das gleiche, wie Sie es beschreiben. Wenn ich jedoch Schritt 2 befolge, heißt es "FATAL: Module usbserial is in use". und ich werde es nicht deaktivieren lassen. Irgendwelche Ideen?
Emilyk
1
Ich habe versucht, einen Weg zu finden, um zu definieren, welches Gerät / welcher Prozess das USB-Modul verwendet, ohne Erfolg. Können Sie "rmmod --force usbserial" ausprobieren?
Sdive
7

Mit der Antwort von sdive bekam ich immer wieder "FATAL: Module usbserial is in use".

Ich habe das Problem schließlich mit Hilfe der Antwort von LiLo hier gelöst: https://askubuntu.com/a/661/379851

Aber anstatt einen C-Code zu verwenden, habe ich ein Python-Äquivalent geschrieben, das auch den betreffenden Bus und das betreffende Gerät findet:

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

Speichern Sie dies einfach als reset_usb.py oder so und führen Sie es dann so aus:

sudo python reset_usb.py driver_name

Wobei driver_name die Ausgabe von ist

lsmod | grep usbserial

In meinem Fall war es cp210x, also führe ich es so aus:

sudo python reset_usb.py cp210x
Peter
quelle
Ist es wirklich notwendig, das entsprechende Gerät auf / dev / bus / usb / xxx / yyy zu ioctl (f, USBDEVFS_RESET, 0)? Reicht es nicht aus, die Anwendung das Gerät / dev / ttyUSBx schließen () und öffnen () zu lassen, wenn festgestellt wird, dass keine Daten mehr eingehen?
Per Lindberg
1

Hier ist meine Antwort für das Modul ftdi_sio. Schritte werden von der obigen Antwort und dem Link von einem Kommentar in der ursprünglichen Frage angepasst.

Ich konnte das Modul nicht entfernen:

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

Also benutze ich den folgenden Trick:

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

Was in der Tat bestätigt wurde durch:

% 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

Dann war es einfach, das Modul zu entfernen:

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

Und dann einfach:

# modprobe ftdi_sio

Dies ist nicht klar, warum ftdi_sio in einen so schlechten Zustand gerät, vielleicht immer noch Fehler wie in:

Aber es scheint, dass Kernel 4.9.20 immer noch ein fehlerhaftes ftdi_sioModul enthält .

malat
quelle