ttyusb를 다시 시작하는 방법 *


12

ttyUSB0 및 ttyUSB1을 통해 데이터를 지속적으로 공급하는 두 개의 장치가 있습니다. 이 데이터를 사용하는 PHP 스크립트가 있습니다. 내가 겪고있는 문제는 때로는 피드가 멈추는 것입니다. 이 문제를 해결하는 가장 좋은 방법은 컴퓨터에서 BUB 보드를 분리했다가 다시 연결하는 것입니다. 그러나이 작업을 자동화하는 방법을 찾고 있습니다. 리눅스에게 기본적으로 BUB 보드를 꺼내고 어떻게 든 다시 데리러 가도록 지시하는 방법이 있습니까?


1
이 다른 스레드에서 해결책을 시도하십시오 : stackoverflow.com/questions/21580750/…

답변:


11

나는 당신과 같은 문제가 있지만 다른 맥락에서 (리눅스 박스에서 시리얼 콘솔을 연다). 직렬 링크가 응답하지 않는 경우가 있으므로 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 : 모듈 usbserial이 사용 중입니다"라고 표시됩니다. 비활성화하지 않습니다. 어떤 아이디어?
emilyk

1
성공하지 않고 usbserial 모듈을 사용하는 장치 / 프로세스를 정의하는 방법을 찾으려고했습니다. "rmmod --force usbserial"을 사용해 볼 수 있습니까?
13:13에

7

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

/ dev / bus / usb / xxx / yyy에서 해당 장치를 ioctl (f, USBDEVFS_RESET, 0)해야합니까? 데이터가 더 이상 도착하지 않음을 감지 할 때 응용 프로그램이 / dev / ttyUSBx 장치를 close () 및 open ()하게하는 것으로 충분하지 않습니까?
Per Lindberg

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.