2013-03-11 5 views
5

क्या लिनक्स पर सीरियल बंदरगाहों से जुड़े सभी जुड़े उपकरणों का पता लगाने का कोई अच्छा तरीका है? मैं सी ++ में प्रोग्रामिंग लेकिन अन्य उदाहरणों का भी स्वागत है।सी ++ लिनक्स सभी धारावाहिक बंदरगाहों का पता लगाता है

आप बस हर बंदरगाह खोलने की कोशिश कर सकते हैं और जब यह सफल होता है तो आप इसे बंदरगाहों की सूची में जोड़ते हैं लेकिन यह वास्तव में एक अच्छा समाधान नहीं लगता है।

आप देव निर्देशकों में जा सकते हैं और चूंकि मेरा सीरियल पोर्ट एक यूएसबी पोर्ट है, मैं जांच सकता हूं कि कौन सी ttyUSb .. फाइलें बनाई गई हैं। लेकिन यह गैर यूएसबी धारावाहिक बंदरगाहों के लिए काम नहीं करता है क्योंकि tty0 तक tty63 तक फ़ाइलों को हमेशा इस निर्देशिका में रखा जाता है।

मेरे उदाहरण:

std::string port; 
int fd 
std::vector<std::string>> list; 
for(int i = 0; i < 256; ++i) 
{ 
    port.clear(); 
    port.append("/dev/ttyUSB"); 
    port.append(std::to_string(i)); 
    fd = open(port.c_str(), O_RDWR | O_NOCTTY | O_DELAY); 
    if(fd != -1) 
    { 
     list.push_back(port); 
    } 
} 

धन्यवाद!

+0

सीरियल बंदरगाहों को आमतौर पर 'ttyS0' नाम दिया जाता है और इसी तरह। – Hasturkun

+1

यह मुझे एक एक्सवाई प्रश्न का अनुभव देता है, जहां आपकी वास्तविक समस्या एक्स है, और आपको लगता है कि समाधान वाई है, इसलिए आप वाई के लिए पूछते हैं। आप सिस्टम पर धारावाहिक बंदरगाहों के बारे में क्यों जानना चाहते हैं? –

+0

बंदरगाहों में से 1 पर एक जिग्बी डिवाइस जुड़ा हुआ है। चूंकि मैं इसे उपयोगकर्ता के अनुकूल बनाना चाहता हूं, इसलिए मैं सभी संभावनाओं को सूचीबद्ध करना चाहता हूं ताकि उपयोगकर्ता चुन सकें। आम तौर पर यदि आप अपने ज़िगबी डिवाइस में प्लग करते हैं तो आपको बिल्कुल एक पोर्ट नंबर लौटाया जाना चाहिए। @ हस्तार्कुन मेरे मामले में जब से मेरा सीरियल डिवाइस यूएसबी कनेक्शन का उपयोग करता है तो इसे ttyUSB0 नाम दिया जाता है। – Silver

उत्तर

7

लिनक्स में उपकरणों की गणना करने का मानक तरीका /sys फाइल सिस्टम ब्राउज़ करना है। इस मामले में, आप निम्नलिखित करने के लिए कर सकते हैं:

  1. की गणना /sys/class/tty
  2. प्रत्येक निर्देशिका /sys/class/tty/foo के लिए में सभी फ़ाइलों, देखें कि क्या /sys/class/tty/foo/devicelstat() का उपयोग कर मौजूद है।
    • यदि यह अस्तित्व में नहीं है तो आप किसी प्रकार के वर्चुअल टीटी डिवाइस (वर्चुअल कंसोल पोर्ट, पीटीएमएक्स, आदि ...) से निपट रहे हैं और आप इसे छोड़ सकते हैं।
    • यदि यह मौजूद है तो सीरियल पोर्ट foo बनाए रखें।

आप वास्तविक सीरियल पोर्ट की सूची के साथ छोड़ दिया जाना चाहिए।

+0

मुझे इस तंत्र के माध्यम से 32 डिवाइस मिलते हैं। 2 मान्य हैं। आपको यह जांचने की ज़रूरत है कि यह 'serial8250' पर इंगित नहीं कर रहा है, जो वास्तव में केवल ड्राइवर – Petesh

+0

है मेरे कई सिस्टमों पर, मेरे पास वास्तविक मान्य सीरियल पोर्ट हैं जहां 'डिवाइस' सिम्लिंक' serial8250' को इंगित करता है ... मैं नहीं हूं सुनिश्चित करें कि आपको इतने सारे अमान्य क्यों मिलते हैं। – Celada

+0

32 कर्नेल कॉन्फ़िगरेशन मान 'CONFIG_SERIAL_8250_RUNTIME_UARTS' से आता है, मुझे लगता है कि यह डिफ़ॉल्ट '32' (यह एक x64 3.2 कर्नेल) से अधिक का समर्थन करने के लिए है। – Petesh

संबंधित मुद्दे