ttyUSB0 및 ttyUSB1을 통해 데이터를 지속적으로 공급하는 두 개의 장치가 있습니다. 이 데이터를 사용하는 PHP 스크립트가 있습니다. 내가 겪고있는 문제는 때로는 피드가 멈추는 것입니다. 이 문제를 해결하는 가장 좋은 방법은 컴퓨터에서 BUB 보드를 분리했다가 다시 연결하는 것입니다. 그러나이 작업을 자동화하는 방법을 찾고 있습니다. 리눅스에게 기본적으로 BUB 보드를 꺼내고 어떻게 든 다시 데리러 가도록 지시하는 방법이 있습니까?
ttyUSB0 및 ttyUSB1을 통해 데이터를 지속적으로 공급하는 두 개의 장치가 있습니다. 이 데이터를 사용하는 PHP 스크립트가 있습니다. 내가 겪고있는 문제는 때로는 피드가 멈추는 것입니다. 이 문제를 해결하는 가장 좋은 방법은 컴퓨터에서 BUB 보드를 분리했다가 다시 연결하는 것입니다. 그러나이 작업을 자동화하는 방법을 찾고 있습니다. 리눅스에게 기본적으로 BUB 보드를 꺼내고 어떻게 든 다시 데리러 가도록 지시하는 방법이 있습니까?
답변:
나는 당신과 같은 문제가 있지만 다른 맥락에서 (리눅스 박스에서 시리얼 콘솔을 연다). 직렬 링크가 응답하지 않는 경우가 있으므로 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의 대답으로 나는 "FATAL : Module usbserial is being used"라는 메시지를 계속 받았습니다.
나는 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
여기서 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
모듈이 포함되어 있습니다 .