วิธีการรีสตาร์ท ttyusb *


12

ฉันมีอุปกรณ์สองเครื่องที่ป้อนข้อมูลอย่างต่อเนื่องผ่าน ttyUSB0 และ ttyUSB1 ฉันมีสคริปต์ php ที่ใช้ข้อมูลนี้ ปัญหาที่ฉันพบคือบางครั้งฟีดก็แค่ค้าง วิธีที่ดีที่สุดที่ฉันเคยเห็นในการแก้ไขปัญหานี้คือการถอดบอร์ด BUB ออกจากคอมพิวเตอร์และเสียบใหม่อีกครั้ง อย่างไรก็ตามฉันกำลังมองหาวิธีที่จะทำให้การกระทำนี้เป็นไปโดยอัตโนมัติ มีวิธีบอกลินุกซ์ให้นำบอร์ด BUB ออกมาแล้วหยิบมันขึ้นมาอีกไหม?


1
ลองวิธีการแก้ปัญหาในหัวข้ออื่นนี้: stackoverflow.com/questions/21580750/…

คำตอบ:


11

ฉันมีปัญหาเดียวกันกับคุณ แต่ในบริบทที่แตกต่างกัน (ฉันเปิดคอนโซลอนุกรมบนกล่อง linux) บางครั้งลิงค์อนุกรมอาจไม่ตอบสนองและฉันต้องถอดปลั๊กตัวแปลงอนุกรม USB ออก

ด้านล่างดูเหมือนจะแก้ปัญหาของฉัน แต่ไม่เสมอไป

  1. ค้นหาไดรเวอร์ที่เกี่ยวข้องกับอุปกรณ์ ttyUSBx ของคุณ

    [my-pc] # cat / proc / tty / ไดรเวอร์

    /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 | greser usbserial

      usbserial              37173  1 pl2303
    

    ในกรณีของฉันตัวแปลง USB เป็นอนุกรมของฉันคือ Prolific PL2303 หากคุณมีอะแดปเตอร์ FTDI ผมคิดว่าคุณควรจะเห็นแทนftdi_siopl2303

  2. ยกเลิกการโหลดไดรเวอร์

    sudo modprobe -r pl2303 # หรือชื่อที่ตรงกับการกำหนดค่าของคุณ

    sudo modprobe -r usbserial

  3. โหลดไดรเวอร์อีกครั้ง

    sudo modprobe pl2303 # หรือชื่อที่ตรงกับการกำหนดค่าของคุณ

  4. เรียกใช้การสื่อสารแบบอนุกรมของคุณอีกครั้ง


ฉันพยายามแล้วทุกอย่างก็เหมือนกันในระบบของฉันตามที่คุณอธิบาย อย่างไรก็ตามเมื่อฉันทำตามขั้นตอนที่ 2 จะมีข้อความระบุว่า "FATAL: Module usbserial ใช้งานอยู่" และจะไม่ให้ฉันปิดการใช้งาน ความคิดใด ๆ
emilyk

1
ฉันพยายามหาวิธีกำหนดอุปกรณ์ / กระบวนการที่ใช้โมดูล usbserial โดยไม่ประสบความสำเร็จ คุณลอง "rmmod --force usbserial" ได้ไหม
sdive

7

ด้วยคำตอบของ sdive ฉันได้รับ "FATAL: Module usbserial ใช้งานอยู่"

ในที่สุดฉันก็แก้ปัญหาด้วยคำแนะนำจากคำตอบของ LiLo ได้ที่นี่: /ubuntu//a/661/379851

แต่แทนที่จะใช้รหัส C บางตัวฉันได้เขียนงูหลามที่เทียบเท่ากับรถบัสและอุปกรณ์ที่เป็นปัญหา:

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

จำเป็นหรือไม่ที่จะต้องใช้ ioctl (f, USBDEVFS_RESET, 0) อุปกรณ์ที่เกี่ยวข้องบน / dev / bus / usb / xxx / yyy? การเปิดแอปพลิเคชันนั้นปิด () และเปิด () อุปกรณ์ / dev / ttyUSBx เมื่อตรวจพบว่าข้อมูลไม่มาถึงอีกต่อไปหรือไม่
ต่อ 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.