लगातार लिनक्स डिवाइस गणन


13

हमारे लिनक्स बॉक्स में हमारे पास USB -> सीरियल डिवाइस है जिसे हमेशा पहचाना जाता था /dev/ttyACM0। इसलिए मैंने एक आवेदन लिखा है और कल तक, सब कुछ ठीक रहा। लेकिन अचानक (हाँ, दूरस्थ प्रस्तुति के दौरान ...) डिवाइस ने काम करना बंद कर दिया। त्वरित शोध के बाद, मैंने पाया कि संबंध बदल गया है /dev/ttyACM1। यह थोड़ा असामयिक था, लेकिन अब मुझे एक समस्या है - कैसे अनायास ही मेरे डिवाइस की पहचान करें? उदाहरण के लिए, यूयूआईडी का उपयोग करके स्टोरेज ड्राइव को इनिशियलाइज़ किया जा सकता है, हालाँकि /dev/sd**यह बदल गया है। क्या धारावाहिक उपकरणों के लिए ऐसा करने का कोई तरीका है?

अब मैं एक बेवकूफ वर्कअराउंड का उपयोग करता हूं:

for(int i = 0; i < 10; i ++)
{
    m_port = std::string("/dev/ttyACM") + (char)('0' + i);
    m_fd = open(m_port.c_str(), O_RDWR | O_NOCTTY | O_NDELAY);
}

जिस डिवाइस का हम उपयोग करते हैं उसका लिंक

जवाबों:


19

चूँकि हम USB उपकरणों के बारे में बात कर रहे हैं और यह मानते हैं कि आपके पास udev है, आप कुछ udv नियमों को सेटअप कर सकते हैं।

मुझे लगता है, और यह सिर्फ एक जंगली अनुमान है, किसी ने या किसी अनप्लग्ड / डिवाइस को हटा दिया है और इसे वापस प्लग इन / डिवाइस को फिर से जोड़ा है, जो संख्या को बढ़ाता है।

अब, पहले आपको विक्रेता और उत्पाद आईडी की आवश्यकता है:

$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 011: ID 0403:6001 FTDI FT232 USB-Serial (UART) IC

अगला, आपको सीरियल नंबर चाहिए (यदि आपके पास कई हैं):

# udevadm info -a -n /dev/ttyUSB1 | grep '{serial}' | head -n1
    ATTRS{serial}=="A6008isP"

अब, एक udev नियम बनाने देता है:

UDEV नियम आमतौर पर कई फाइलों में बिखरे रहते हैं /etc/udev/rules.d। नामक एक नई फ़ाइल बनाएं 99-usb-serial.rulesऔर उसमें निम्नलिखित लाइन डालें, मेरे पास तीन डिवाइस हैं, जिनमें से प्रत्येक में एक अलग सीरियल नंबर है:

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A6008isP", SYMLINK+="MySerialDevice"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A7004IXj", SYMLINK+="MyOtherSerialDevice"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="FTDIF46B", SYMLINK+="YetAnotherSerialDevice"

ls -l /dev/MySerialDevice
lrwxrwxrwx 1 root root 7 Nov 25 22:12 /dev/MySerialDevice -> ttyUSB1

यदि आप सीरियल नंबर नहीं चाहते हैं, तो उसी चिप के साथ विक्रेता से कोई भी उपकरण समान सिमिलिंक प्राप्त करेगा, किसी भी समय केवल एक ही प्लग किया जा सकता है।

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="MySerialDevice"

यहां से ले गए


3
यदि आपके पास हाल ही में लिनक्स वितरण है, तो सबसे अधिक संभावना है कि यह पहले से ही डिवाइस को स्वचालित रूप से बनाता है /dev/serial/by-id/usb-XXXX_USB2.0-Serial-if00-port0। यह कस्टम udev नियमों के बिना आपके लिए पर्याप्त हो सकता है।
जोसेफ का कहना है कि मोनिका

1
दुर्भाग्य से, कई नो-नाम उपकरणों में सभी सीरियल नंबर "0123456789abcdef" हैं। बस यहीं से दिलचस्प हो जाता है।
मॉसवी

@mosvy सीरियल नंबर अपरिवर्तनीय हैं?
ओगनम

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