ttyusb *を再起動する方法


12

ttyUSB0とttyUSB1を介して継続的にデータを供給している2つのデバイスがあります。このデータを使用しているphpスクリプトがあります。私が直面している問題は、フィードが時々フリーズすることです。これを修正するために私が見た最善の方法は、コンピューターからBUBボードを取り外し、再度接続することです。ただし、このアクションを自動化する方法を探しています。Linuxに基本的にBUBボードをイジェクトし、それから再びそれを拾うように指示する方法はありますか?


1
この他のスレッドで解決策をお試しください:stackoverflow.com/questions/21580750/...

回答:


11

私はあなたと同じ問題を抱えていますが、異なるコンテキストです(Linuxボックスでシリアルコンソールを開きます)。シリアルリンクが応答しなくなることがあり、USBシリアルコンバーターを物理的に取り外す必要があります。

以下は私の問題を解決するようですが、いつもではありません。

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

    /dev/ttyUSB使用してusbserialいることがわかります。さらにもう少し掘り下げます。

    [my-pc]#lsmod | grep usbserial

      usbserial              37173  1 pl2303
    

    私の場合、USB-シリアルコンバーターはProlific PL2303です。FTDIアダプタをお持ちの場合、のftdi_sio代わりに表示されるはずですpl2303

  2. ドライバーをアンロードします

    sudo modprobe -r pl2303#または設定に一致する名前

    sudo modprobe -r usbserial

  3. ドライバーを再ロードする

    sudo modprobe pl2303#または設定に一致する名前

  4. シリアル通信を再起動します


私はそれを試みています、そして、あなたが説明するように、すべては私のシステムで同じです。ただし、ステップ2を実行すると、「FATAL:Module usbserial is in use」と表示されます。無効にすることはできません。何か案は?
emilyk

1
成功せずに、どのデバイス/プロセスがusbserialモジュールを使用するかを定義する方法を見つけようとしていました。「rmmod --force usbserial」を試すことができますか?
13:17

7

sdiveの回答で、「致命的:モジュールusbserialが使用中です」というメッセージが表示され続けました。

ここで、LiLoの回答からのガイダンスで問題を解決しました:https ://askubuntu.com/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

ここで、driver_nameはからの出力です

lsmod | grep usbserial

私の場合、それはcp210xだったので、次のように実行します。

sudo python reset_usb.py cp210x

/ dev / bus / usb / xxx / yyy上の対応するデバイスをioctl(f、USBDEVFS_RESET、0)することが本当に必要ですか?データが到着しなくなったことをアプリケーションが検出したときに、アプリケーションが/ dev / ttyUSBxデバイスをclose()およびopen()できるようにするだけでは不十分ですか?
リンドバーグ

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モジュールが含まれているようです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.