Як перезапустити ttyusb *


12

У мене є два пристрої, які постійно подають дані через ttyUSB0 і ttyUSB1. У мене є скрипти php, які використовують ці дані. Проблема, з якою я стикаюся, полягає в тому, що іноді канал просто замерзає. Найкращий спосіб, який я бачив, щоб це виправити - це від'єднати плату BUB від комп'ютера та підключити її знову. Однак я шукаю спосіб автоматизації цієї дії. Чи є спосіб сказати Linux по суті вийняти плату BUB, а потім якось знову забрати її?


1
Спробуйте рішення в цій другій потоці: stackoverflow.com/questions/21580750 / ...

Відповіді:


11

У мене така ж проблема, що і у вас, але в іншому контексті (я відкриваю послідовну консоль на вікні linux). Послідовна посилання іноді стає невідповідною, і мені доведеться фізично відключити USB-послідовний перетворювач.

Наведене нижче, здається, вирішує мою проблему, але не завжди.

  1. Знайдіть драйвер, пов’язаний із вашим пристроєм ttyUSBx.

    [my-pc] # cat / proc / tty / драйвери

    /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
    

    Ви можете бачити, що /dev/ttyUSBвикористовує usbserial. Тепер копайте трохи далі:

    [my-pc] # lsmod | grep usbserial

      usbserial              37173  1 pl2303
    

    У моєму випадку мій USB-серійний перетворювач - це плідний PL2303. Якщо у вас є адаптер FTDI, я думаю, ви повинні побачити ftdi_sioзамість нього pl2303.

  2. Вивантажте драйвер

    sudo modprobe -r pl2303 # або ім'я, яке відповідає вашій конфігурації

    sudo modprobe -r usbserial

  3. Перезавантажте драйвер

    sudo modprobe pl2303 # або ім'я, яке відповідає вашій конфігурації

  4. Повторно запустити свій послідовний зв’язок


Я це намагаюся, і в моїй системі все те саме, що ви описуєте. Однак, коли я дотримуюся кроку 2, він говорить "FATAL: Модуль usbserial використовується." і не дозволять мені відключити це. Будь-які ідеї?
emilyk

1
Я намагався знайти спосіб визначити, який пристрій / процес без успіху використовує модуль usbserial. Чи можете ви спробувати "rmmod --force usbserial"?
sdive

7

З відповіддю sdive я продовжував отримувати "FATAL: Модуль usbserial використовується".

Нарешті я вирішив проблему з деякими вказівками з відповіді LiLo тут: /ubuntu//a/661/379851

Але замість того, щоб використовувати якийсь код C, я написав еквівалент python, який також знаходить потрібну шину та пристрій:

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

Просто збережіть це як reset_usb.py або щось подібне, а потім запустіть його так:

sudo python reset_usb.py driver_name

Там, де ім'я_файлу - вихід з

lsmod | grep usbserial

У моєму випадку це було cp210x, тому я запускаю його так:

sudo python reset_usb.py cp210x

Чи дійсно потрібно ioctl (f, USBDEVFS_RESET, 0) відповідний пристрій на / dev / bus / usb / xxx / yyy? Чи недостатньо лише дозволити програмі закрити () та відкрити () пристрій / dev / ttyUSBx, коли він виявить, що дані більше не надходять?
Пер Ліндберг

1

Ось моя відповідь на модуль ftdi_sio. Кроки адаптовані з вищенаведеної відповіді та посилання з коментаря до оригінального питання.

Не вдалося видалити модуль:

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

Тому я використовую наступний трюк:

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

Що дійсно було підтверджено:

% 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

Тоді модуль було легко видалити:

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

А потім просто:

# modprobe ftdi_sio

Це не зрозуміло, чому ftdi_sio потрапляє в таку погану форму, можливо, все-таки помилка, як у:

Але, схоже, ядро ​​4.9.20 все ще містить поганий ftdi_sioмодуль.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.