Ttyusb nasıl yeniden başlatılır *


12

Sürekli ttyUSB0 ve ttyUSB1 aracılığıyla veri besleyen iki cihazım var. Bu verileri kullanan php komut dosyaları var. Karşılaştığım sorun bazen yem sadece bir çeşit donuyor. Bunu düzeltmenin en iyi yolu, BUB kartını bilgisayardan çıkarıp tekrar takmaktır. Ancak, bu işlemi otomatikleştirmenin bir yolunu arıyorum. Linux'a temel olarak BUB tahtasını çıkarmasını ve bir şekilde tekrar almasını söylemenin bir yolu var mı?


1
Bu diğer konudaki çözümü deneyin: stackoverflow.com/questions/21580750/…

Yanıtlar:


11

Seninle aynı sorunu yaşıyorum ama farklı bir bağlamda (linux kutusunda seri bir konsol açıyorum). Seri bağlantı bazen yanıt vermiyor ve USB seri dönüştürücüyü fiziksel olarak çıkarmam gerekiyor.

Aşağıdakiler sorunumu çözüyor gibi görünüyor, ama her zaman değil.

  1. TtyUSBx aygıtınızla ilişkili sürücüyü bulun.

    [bilgisayarım] # kedi / proc / tty / sürücüler

    /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
    

    Bunun /dev/ttyUSBkullanımlarını görebilirsiniz usbserial. Şimdi biraz daha kazın:

    [bilgisayarım] # lsmod | grep usbserial

      usbserial              37173  1 pl2303
    

    Benim durumumda, USB-seri dönüştürücüm Prolific PL2303'tür. Bir FTDI adaptörünüz varsa, ftdi_siobunun yerine görmeniz gerektiğini düşünüyorum pl2303.

  2. Sürücüyü kaldırın

    sudo modprobe -r pl2303 # veya yapılandırmanızla eşleşen ad

    sudo modprobe -r usbserial

  3. Sürücüyü yeniden yükleyin

    sudo modprobe pl2303 # veya yapılandırmanızla eşleşen ad

  4. Seri iletişiminizi yeniden başlatın


Bunu deniyorum ve sistemimde tarif ettiğiniz gibi her şey aynı. Ancak, 2. adımı uyguladığımda "FATAL: Modül usbserial kullanımda" yazıyor. ve devre dışı bırakmama izin vermeyeceğim. Herhangi bir fikir?
emilyk

1
Hangi cihazın / sürecin usbserial modülünü başarıyla kullandığını tanımlamanın bir yolunu bulmaya çalışıyordum. "Rmmod --force usbserial" deneyebilir misiniz?
13'te

7

Sdive'nin cevabı ile "FATAL: Modül usbserial kullanımda" almaya devam ettim.

Sonunda sorunu şu anda LiLo'nun cevabından bazı rehberliklerle çözdüm: /ubuntu//a/661/379851

Ama bazı C kodu kullanmak yerine, aynı zamanda söz konusu otobüs ve cihazı da bulan bir python eşdeğeri yazdım:

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

Bunu reset_usb.py veya başka bir şey olarak kaydedin ve ardından şu şekilde çalıştırın:

sudo python reset_usb.py driver_name

Burada sürücü_adı çıktısı

lsmod | grep usbserial

Benim durumumda, cp210x, bu yüzden böyle çalıştırmak:

sudo python reset_usb.py cp210x

/ Dev / bus / usb / xxx / yyy'de ilgili cihazı ioctl (f, USBDEVFS_RESET, 0) gerçekten gerekli mi? Verilerin artık gelmediğini algıladığında uygulamanın / dev / ttyUSBx cihazını kapatmasına () ve açmasına () izin vermesi yeterli değil mi?
Per Lindberg

1

İşte modül için cevabım ftdi_sio. Adımlar yukarıdaki cevaptan ve orijinal sorudaki bir yorumun bağlantısından uyarlanmıştır.

Çıkarılacak modülü alamadım:

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

Bu yüzden aşağıdaki hileyi kullanıyorum:

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

Gerçekten de:

% 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

Sonra modülü çıkarmak kolay oldu:

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

Ve sonra basitçe:

# modprobe ftdi_sio

Bu neden ftdi_sio'nun bu kadar kötü bir şekle girdiği belli değil, belki de hala olduğu gibi hata olabilir:

Ancak çekirdek 4.9.20 hala kötü ftdi_siomodül içeriyor gibi görünüyor .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.