Ttyusb को कैसे पुनः आरंभ करें *


12

मेरे पास दो डिवाइस हैं जो लगातार ttyUSB0 और ttyUSB1 के माध्यम से डेटा खिला रहे हैं। मेरे पास php स्क्रिप्ट हैं जो इस डेटा का उपयोग कर रही हैं। मैं जिस समस्या में चल रहा हूं, वह यह है कि कभी-कभी फीड सिर्फ एक तरह का फ्रीज होता है। इसे ठीक करने का सबसे अच्छा तरीका यह है कि कंप्यूटर से BUB बोर्ड को अनप्लग करें और इसे फिर से प्लग करें। हालांकि, मैं इस कार्रवाई को स्वचालित करने का एक तरीका ढूंढ रहा हूं। क्या लाइन को बताने के लिए BUB बोर्ड को अनिवार्य रूप से बेदखल करने और फिर किसी तरह इसे लेने का कोई तरीका है?


1
इस अन्य सूत्र में समाधान का प्रयास करें: stackoverflow.com/questions/21580750/…

जवाबों:


11

मुझे आपके समान ही समस्या हो रही है लेकिन एक अलग संदर्भ में (मैं एक लिनक्स बॉक्स पर एक सीरियल कंसोल खोलता हूं)। सीरियल लिंक कभी-कभी अनुत्तरदायी हो जाता है और मुझे यूएसबी-सीरियल कनवर्टर को शारीरिक रूप से अनप्लग करना पड़ता है।

नीचे मेरी समस्या को हल करने के लिए लगता है, लेकिन हमेशा नहीं।

  1. अपने ttyUSBx डिवाइस से संबंधित ड्राइवर का पता लगाएं।

    [my-pc] # कैट / 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 | grep usbserial

      usbserial              37173  1 pl2303
    

    मेरे मामले में, मेरा USB-to-सीरियल कनवर्टर एक प्रोलिफिक 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 - usbserial" की कोशिश कर सकते हैं?
sdive

7

Siveive के उत्तर के साथ मुझे "FATAL: मॉड्यूल usbserial उपयोग में है" मिलता रहा।

मैंने आखिरकार लीलो के उत्तर के कुछ मार्गदर्शन के साथ समस्या को हल किया: /ubuntu//a/661/379851

लेकिन कुछ सी कोड का उपयोग करने के बजाय, मैंने एक अजगर के बराबर लिखा, जो कि बस और डिवाइस को सवाल में पाता है:

#!/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) / देव / बस / usb / xxx / yy पर संबंधित उपकरण आवश्यक है? क्या यह पर्याप्त नहीं है कि एप्लिकेशन को बंद करें () और खोलें () / dev / ttyUSBx डिवाइस जब यह पता लगाता है कि डेटा अब नहीं आता है?
लिंडबर्ग

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मॉड्यूल है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.