ttyUSB0とttyUSB1を介して継続的にデータを供給している2つのデバイスがあります。このデータを使用しているphpスクリプトがあります。私が直面している問題は、フィードが時々フリーズすることです。これを修正するために私が見た最善の方法は、コンピューターからBUBボードを取り外し、再度接続することです。ただし、このアクションを自動化する方法を探しています。Linuxに基本的にBUBボードをイジェクトし、それから再びそれを拾うように指示する方法はありますか?
ttyUSB0とttyUSB1を介して継続的にデータを供給している2つのデバイスがあります。このデータを使用しているphpスクリプトがあります。私が直面している問題は、フィードが時々フリーズすることです。これを修正するために私が見た最善の方法は、コンピューターからBUBボードを取り外し、再度接続することです。ただし、このアクションを自動化する方法を探しています。Linuxに基本的にBUBボードをイジェクトし、それから再びそれを拾うように指示する方法はありますか?
回答:
私はあなたと同じ問題を抱えていますが、異なるコンテキストです(Linuxボックスでシリアルコンソールを開きます)。シリアルリンクが応答しなくなることがあり、USBシリアルコンバーターを物理的に取り外す必要があります。
以下は私の問題を解決するようですが、いつもではありません。
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
。
ドライバーをアンロードします
sudo modprobe -r pl2303#または設定に一致する名前
sudo modprobe -r usbserial
ドライバーを再ロードする
sudo modprobe pl2303#または設定に一致する名前
シリアル通信を再起動します
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
モジュールに対する私の答えです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
モジュールが含まれているようです。