लिनक्स सिस्टम पर सभी उपलब्ध सीरियल पोर्ट / उपकरणों की सूची प्राप्त करने का उचित तरीका क्या है?
दूसरे शब्दों में, जब मैं सभी उपकरणों पर पुनरावृति /dev/
करता हूं, तो मैं कैसे बताऊं कि कौन से क्लासिक तरीके से सीरियल पोर्ट हैं, अर्थात, जो आमतौर पर बॉड दरों और आरटीएस / सीटीएस प्रवाह नियंत्रण का समर्थन करते हैं?
समाधान सी में कोडित किया जाएगा।
मैं पूछता हूं क्योंकि मैं एक तृतीय-पक्ष लाइब्रेरी का उपयोग कर रहा हूं जो यह स्पष्ट रूप से गलत करता है: यह केवल पुनरावृति प्रतीत होता है /dev/ttyS*
। समस्या यह है कि उदाहरण के लिए, USB पर सीरियल पोर्ट (USB-RS232 एडेप्टर द्वारा प्रदान किए गए) हैं, और वे / dev / ttyUSB * के तहत सूचीबद्ध हैं। और Linux.org पर Serial-HOWTO को पढ़कर , मुझे यह विचार आया कि समय आने पर अन्य नाम स्थान भी होंगे।
इसलिए मुझे धारावाहिक उपकरणों का पता लगाने का आधिकारिक तरीका खोजने की आवश्यकता है। समस्या यह है कि कोई भी प्रलेखित प्रतीत नहीं होता है, या मुझे नहीं मिल रहा है।
मुझे लगता है कि एक तरह से सभी फाइलों को खोलने /dev/tty*
और ioctl()
उन पर एक विशिष्ट कॉल करने के लिए होगा जो केवल धारावाहिक उपकरणों पर उपलब्ध है। हालांकि यह एक अच्छा समाधान होगा?
अपडेट करें
hricards ने "सेटसेरीअल" के स्रोत को देखने का सुझाव दिया। इसका कोड वही है जो मेरे मन में था:
सबसे पहले, यह एक उपकरण खोलता है:
fd = open (path, O_RDWR | O_NONBLOCK)
फिर यह आह्वान करता है:
ioctl (fd, TIOCGSERIAL, &serinfo)
यदि वह कॉल कोई त्रुटि नहीं देता है, तो यह एक सीरियल डिवाइस है, जाहिरा तौर पर।
मुझे सीरियल प्रोग्रामिंग / टर्मिनस में समान कोड मिला , जिसने O_NOCTTY
विकल्प को जोड़ने का सुझाव दिया ।
इस दृष्टिकोण के साथ एक समस्या है, हालांकि:
जब मैंने बीएसडी यूनिक्स (यानी मैक ओएस एक्स) पर इस कोड का परीक्षण किया, तो इसने भी काम किया। हालांकि , ब्लूटूथ के माध्यम से प्रदान किए जाने वाले सीरियल डिवाइस ब्लूटूथ डिवाइस से कनेक्ट करने का प्रयास करने के लिए सिस्टम (ड्राइवर) का कारण बनते हैं, जो टाइमआउट त्रुटि के साथ वापस आने से पहले थोड़ी देर लेता है। यह केवल डिवाइस को खोलने के कारण होता है। और मैं कल्पना कर सकता हूं कि इसी तरह की चीजें लिनक्स पर भी हो सकती हैं - आदर्श रूप से, मुझे इसके प्रकार का पता लगाने के लिए डिवाइस को खोलने की आवश्यकता नहीं होनी चाहिए। मुझे आश्चर्य है कि अगर वहाँ भी एक तरह से ioctl
खुले बिना कार्य करने का एक तरीका है , या एक उपकरण को इस तरह से खोलना है कि यह कनेक्शन का कारण नहीं बनता है?
मुझे क्या करना चाहिए?