लिनक्स के लिए वर्चुअल सीरियल पोर्ट


128

मुझे लिनक्स पर एक सीरियल पोर्ट एप्लिकेशन का परीक्षण करने की आवश्यकता है, हालांकि, मेरी टेस्ट मशीन में केवल एक सीरियल पोर्ट है।

क्या लिनक्स में एक वर्चुअल सीरियल पोर्ट जोड़ने और शेल या स्क्रिप्ट के माध्यम से डिवाइस का अनुकरण करके मेरे आवेदन का परीक्षण करने का एक तरीका है?

नोट: मैं पोर्ट को रीमैप नहीं कर सकता, यह ttys2 पर हार्ड कोडित है और मुझे एप्लिकेशन को परीक्षण करने की आवश्यकता है क्योंकि यह लिखा गया है।

जवाबों:


75

आप इसके लिए एक pty ("छद्म-टेलेटाइप" का उपयोग कर सकते हैं, जहां एक सीरियल पोर्ट "वास्तविक टेलेटाइप" है)। एक छोर से, खोलें /dev/ptyp5, और फिर अपने कार्यक्रम को संलग्न करें /dev/ttyp5; ttyp5एक सीरियल पोर्ट की तरह काम करेगा, लेकिन यह / देव / ptyp5 के माध्यम से सब कुछ भेजेगा / प्राप्त करेगा।

क्या तुम सच में नामक एक फाइल करने के लिए बात करने के लिए यह की जरूरत है /dev/ttys2, तो बस अपने पुराने ले जाने के /dev/ttys2रास्ते से बाहर और से एक सिमलिंक बनाने ptyp5के लिए ttys2

बेशक आप इसके अलावा कुछ संख्या का उपयोग कर सकते हैं ptyp5। शायद डुप्लिकेट से बचने के लिए एक उच्च संख्या के साथ एक को चुनें, क्योंकि आपके सभी लॉगिन टर्मिनल भी ptys का उपयोग करेंगे।

विकिपीडिया में ptys के बारे में अधिक जानकारी है: http://en.wikipedia.org/wiki/Pseudo_terminal


8
लिनक्स पर आप ओपेन खाली / फोर्क खाली सिस्टम कॉल का उपयोग कर सकते हैं। मैन पेज
मैथ्यू स्मिथ

8
कमांड लाइन टूल का उपयोग करके वर्चुअल सीरियल पोर्ट जोड़ी कैसे बनाएं?
लिनजुनहलिडा

8
ध्यान दें कि कई सीरियल पोर्ट पैरामीटर, जैसे बॉड्रेट, समता, hw प्रवाह नियंत्रण, चरित्र आकार (?) को pty में लागू नहीं किया जाता है, इस प्रकार सीरियल ट्रांसमिशन त्रुटियों की उपस्थिति में आपके आवेदन का परीक्षण करना असंभव है।
दीमा टिस्नेक

10
यह सहायक है, लेकिन यह "पुरानी शैली" बीएसडी छद्म टर्मिनलों का वर्णन करता है। "नई शैली" UNIX 98 छद्म-टर्मिनलों का विवरण अलग-अलग है - विवरण के लिए ptsमैन पेज देखें।
क्रेग मैकक्वीन

3
@LaszloPapp मैं माफी माँगता हूँ, मैं पूरे समय झूठ बोल रहा था
मैथ्यू स्मिथ

160

@ Slonik के उत्तर को लागू करना।

आप निम्न प्रक्रिया को करते हुए वर्चुअल सीरियल पोर्ट बनाने के लिए सोसाइट का परीक्षण कर सकते हैं (Ubuntu 12.04 पर परीक्षण किया गया):

एक टर्मिनल खोलें (इसे टर्मिनल 0 कहते हैं) और इसे निष्पादित करें:

socat -d -d pty,raw,echo=0 pty,raw,echo=0

रिटर्न के ऊपर कोड:

2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/2
2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/3
2013/11/01 13:47:27 socat[2506] N starting data transfer loop with FDs [3,3] and [5,5]

दूसरा टर्मिनल खोलें और लिखें (टर्मिनल 1):

cat < /dev/pts/2

इस कमांड का पोर्ट नाम पीसी के अनुसार बदला जा सकता है। यह पिछले आउटपुट पर निर्भर करता है।

2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/**2**
2013/11/01 13:47:27 socat[2506] N PTY is /dev/pts/**3**
2013/11/01 13:47:27 socat[2506] N starting data transfer loop with FDs 

आपको हाइलाइट किए गए क्षेत्र पर उपलब्ध संख्या का उपयोग करना चाहिए।

दूसरा टर्मिनल खोलें और लिखें (टर्मिनल 2):

echo "Test" > /dev/pts/3

अब टर्मिनल 1 पर वापस जाएँ और आप स्ट्रिंग "टेस्ट" देखेंगे।


इसने मेरे लिए स्लोनिक के उत्तर की तुलना में बेहतर काम किया, क्योंकि यह वर्चुअल COM पोर्ट फाइलों में ऑटो-असाइन करता है, और गूंज नहीं करता है।
gbmhunter

7
यदि आप link=/path/to/linkप्रत्येक डिवाइस-घोषणा (गूंज = 0 के बाद) के बाद प्रतिलिपि प्रस्तुत करने योग्य फ़ाइल नाम का उपयोग करना चाहते हैं । इस प्रकार इसका उपयोग स्वचालित परीक्षणों में किया जा सकता है। (जैसा कि उनके उत्तर में स्लोनिक करता है)
पैट्रिक बी।

यह ठीक उसी तरह काम करता है जैसा उल्लेख किया गया है। इसने मुझे धन्यवाद देने में मदद की।
nim118

1
एक वास्तविक सीरियल पोर्ट से लिंक करने के लिए एक pty बनाने के लिए socat -d -d pty,raw,echo=0 /dev/ttyUSB5,raw,echo=0:।
पेंघे गेंग

क्या मैं /dev/ttyS0इसके बजाय नामों के साथ एक सीरियल पोर्ट बना सकता हूं /dev/pts/1?
mrid

48

इसके लिए समाज का उपयोग करें:

उदाहरण के लिए:

socat PTY,link=/dev/ttyS10 PTY,link=/dev/ttyS11

यह मेरे लिए अच्छी तरह से काम किया, minicom के साथ परीक्षण किया गया! ऐसा लगता है जैसे एक टर्मिनल पर इनपुट दोनों के लिए गूँज जाता है (इसलिए यह इनपुट टर्मिनल पर भी फिर से दिखाई देगा)।
gbmhunter 4

1
मेरे पास एको इको व्यवहार नहीं है ... मिनिकॉम में "लोकल इको" फीचर है ... लेकिन जब इसे अक्षम किया जाता है, तो यह वास्तव में एक वास्तविक सीरियल पोर्ट के रूप में काम करता है। पारितोषिक के लिए धन्यवाद।
cpt Hammer

16

Tty0tty भी है। http://sourceforge.net/projects/tty0tty/ जो लिनक्स के लिए एक वास्तविक अशक्त मॉडेम एमुलेटर है।

यह एक सरल कर्नेल मॉड्यूल है - एक छोटा स्रोत फ़ाइल। मुझे नहीं पता कि यह केवल स्रोत के नीचे ही क्यों मिला, लेकिन यह मेरे लिए अच्छा काम करता है। इसके बारे में सबसे अच्छी बात यह है कि यह हार्डवेयर पिन (RTC / CTS DSR / DTR) का भी अनुकरण करता है। यह भी TIOCMGET / TIOCMSET और TIOCMIWAIT iotcl कमांडों को लागू करता है!

हाल के कर्नेल पर आपको संकलन त्रुटियाँ मिल सकती हैं। इसे ठीक करना आसान है। बस मॉड्यूल / tty0tty.c स्रोत के शीर्ष पर कुछ लाइनें डालें (शामिल करने के बाद):

#ifndef init_MUTEX
#define init_MUTEX(x) sema_init((x),1)
#endif

जब मॉड्यूल लोड किया जाता है, तो यह सीरियल पोर्ट के 4 जोड़े बनाता है। उपकरण / dev / tnt0 to / dev / tnt7 हैं जहाँ tnt0 को tnt1 से जोड़ा गया है, tnt2 को tnt3 से जोड़ा गया है, आदि आपको उपकरणों का उपयोग करने में सक्षम होने के लिए फ़ाइल अनुमतियों को ठीक करने की आवश्यकता हो सकती है।

संपादित करें:

मुझे लगता है कि मैं अपने उत्साह के साथ थोड़ा तेज था। जबकि ड्राइवर आशाजनक दिखता है, यह अस्थिर लगता है। मुझे यकीन नहीं है, लेकिन मुझे लगता है कि यह कार्यालय में एक मशीन को दुर्घटनाग्रस्त कर दिया था जो मैं घर से काम कर रहा था। मैं सोमवार को कार्यालय में वापस आने तक जांच नहीं कर सकता।

दूसरी बात यह है कि TIOCMIWAIT काम नहीं करता है। कोड को कुछ "छोटे ट्टी" उदाहरण कोड से कॉपी किया गया लगता है। TIOCMIWAIT की हैंडलिंग जगह में लगती है, लेकिन यह कभी नहीं उठता क्योंकि aw_up_interruptible () के लिए संबंधित कॉल गायब है।

संपादित करें:

कार्यालय में दुर्घटना वास्तव में ड्राइवर की गलती थी। एक आरंभीकरण गायब था, और पूरी तरह से अप्राप्त TIOCMIWAIT कोड के कारण मशीन के दुर्घटनाग्रस्त हो गया।

मैंने कल और आज ड्राइवर को फिर से लिखने में खर्च किया। बहुत सारे मुद्दे थे, लेकिन अब यह मेरे लिए अच्छा है। अभी भी ड्राइवर द्वारा प्रबंधित हार्डवेयर प्रवाह नियंत्रण के लिए कोड गायब है, लेकिन मुझे इसकी आवश्यकता नहीं है क्योंकि मैं उपयोगकर्ता मोड कोड से TIOCMGET / TIOCMSET / TIOCMIWAIT का उपयोग करके खुद पिन का प्रबंधन करूंगा।

अगर किसी को मेरे कोड के संस्करण में दिलचस्पी है, तो मुझे एक संदेश भेजें और मैं आपको इसे भेजूंगा।


2
मुझे आपका कोड देखने में दिलचस्पी होगी। क्या आप इसे tty0tty प्रोजेक्ट में वापस योगदान दे सकते हैं? हालाँकि, मैं लोगों को लिनक्स कर्नेल में छद्म टर्मिनल कोड में सुधार देखना पसंद करूँगा। उदाहरण के लिए हार्डवेयर हैंडशेकिंग समर्थन और TIOCMIWAIT जोड़ें।
क्रेग मैकक्यून

3
"अगर किसी को कोड के मेरे संस्करण में दिलचस्पी है, तो मुझे एक संदेश भेजें और मैं आपको इसे भेजूंगा।" हाँ, मुझे दिलचस्पी है! क्या आप इसे कहीं इंगित कर सकते हैं, उदाहरण के लिए GitHub पर?
क्रेग मैकक्यून

7
मैंने ड्राइवर को इस पर अपलोड किया: github.com/pitti98/nullmodem क्षमा करें उत्तर देने में इतना समय लगा। मैं stackoverflow पर बहुत सक्रिय नहीं हूँ और आपकी टिप्पणी को अनदेखा कर रहा हूँ!
पीटर रिमर्स 20

नहीं, मैंने इसे लिखा था क्योंकि मुझे इसकी आवश्यकता थी और एक बार रुकने के बाद यह करना अच्छा था कि मुझे क्या चाहिए। अब जब यह सार्वजनिक हो गया है, तो मुझे आशा है कि यह किसी और के लिए उपयोगी है, और शायद कोई इसे उठाता है जहां मैंने इसे छोड़ा था।
पीटर रिमर्स

8

आप एक कर्नेल ड्राइवर का उपयोग करके एक लिनक्स वर्चुअल सीरियल पोर्ट बनाने के लिए टिब्बो वीएसपीडीएल को देखना चाहते हैं - यह बहुत नया लगता है, और अभी डाउनलोड (बीटा संस्करण) के लिए उपलब्ध है। इस बिंदु पर लाइसेंस के बारे में निश्चित नहीं है, या वे इसे केवल भविष्य में व्यावसायिक रूप से उपलब्ध कराना चाहते हैं।

अन्य वाणिज्यिक विकल्प हैं, जैसे कि http://www.ttyredirector.com/

ओपन सोर्स में, रिमिक्सियल (GPL) भी वही कर सकता है जो आप चाहते हैं, यूनिक्स PTY का उपयोग करके। यह सीरियल डेटा को "कच्चे रूप" में एक नेटवर्क सॉकेट में प्रसारित करता है; पोर्ट बनाते समय टर्मिनल मापदंडों का STTY जैसा सेटअप किया जाना चाहिए, उन्हें बाद में बदलना जैसे कि RFC 2217 में वर्णित है, समर्थित नहीं लगता है। आपको com0com की तरह एक आभासी nullmodem बनाने के लिए दो पुनरावृत्त उदाहरणों को चलाने में सक्षम होना चाहिए, सिवाय इसके कि आपको पहले से पोर्ट गति आदि स्थापित करने की आवश्यकता होगी।

सोकेट (जीपीएल भी) रेसरियल के एक विस्तारित संस्करण की तरह कई और विकल्पों के साथ है, जिसमें पीटीवाई को किसी अन्य चीज़ पर पुनर्निर्देशित करने के लिए "पीटीवाई" विधि भी शामिल है, जो सोकोट का एक और उदाहरण हो सकता है। यूनिट टेट्स के लिए, सोसाइटी संभवतया रीसेरियल की तुलना में अच्छा है क्योंकि आप सीधे पीटीवाई में फाइलों को कैच कर सकते हैं। मैन पेज पर PTY उदाहरण देखें । सीरियल लाइन सेटिंग्स पर बातचीत के लिए RFC2217 सहायता प्रदान करने के लिए एक पैच "कॉन्ट्रिब" ​​के तहत मौजूद है


6

पिछले उत्तरों में पोस्ट किए गए लिंक का उपयोग करके, मैंने वर्चुअल सीरियल पोर्ट का उपयोग करके C ++ में एक छोटा सा उदाहरण कोडित किया। मैंने कोड को GitHub: https://github.com/cymait/virtual-serial-port-example में धकेल दिया ।

कोड बहुत आत्म व्याख्यात्मक है। सबसे पहले, आप रनिंग करके मास्टर प्रोसेस बनाते हैं ।/ मास्टर करें और यह डिवाइस को उपयोग करने वाले stderr पर प्रिंट करेगा। उसके बाद, आप इनवॉइस करें। / मेन स्लेव डिवाइस, जहां डिवाइस पहले कमांड में प्रिंट किया गया डिवाइस है।

और बस। आपके पास दो प्रक्रिया के बीच एक द्विदिश लिंक है।

इस उदाहरण का उपयोग करके आप सभी प्रकार के डेटा भेजकर आवेदन का परीक्षण कर सकते हैं, और देख सकते हैं कि यह सही ढंग से काम करता है या नहीं।

इसके अलावा, आप हमेशा डिवाइस को सिमलिंक कर सकते हैं, इसलिए आपको उस एप्लिकेशन को फिर से संकलित करने की आवश्यकता नहीं है जिसे आप परीक्षण कर रहे हैं।


1
जबकि (पढ़ें (fd, & inputbyte, 1) == 1) {...} पढ़ा आपके कोड में अपरिभाषित है। लिखना अपरिभाषित है। पास अपरिभाषित है।
मैट एस्प एस्प

4

क्या आप USB-> RS232 एडेप्टर का उपयोग कर पाएंगे? मेरे पास कुछ है, और वे सिर्फ FTDI ड्राइवर का उपयोग करते हैं। उसके बाद, आपको / dev / ttyUSB0 का नाम बदलने में सक्षम होना चाहिए (या जो कुछ भी बनाया जाता है) / dev / ttyS2।


4

मैं तीन विकल्पों के बारे में सोच सकता हूं:

RFC 2217 को लागू करें

RFC 2217 टीसीपी / आईपी मानक के लिए एक कॉम पोर्ट को कवर करता है जो क्लाइंट को एक सिस्टम पर स्थानीय कार्यक्रमों के लिए सीरियल पोर्ट का अनुकरण करने की अनुमति देता है, जबकि डेटा और नियंत्रण संकेतों को पारदर्शी रूप से भेजने और प्राप्त करने के लिए किसी अन्य सिस्टम पर सर्वर को नियंत्रित करता है जो वास्तव में सीरियल पोर्ट है। यहाँ एक उच्च-स्तरीय अवलोकन है

आप ऐसा क्या करेंगे जो एक क्लाइंट कॉम पोर्ट ड्राइवर को मिलेगा या कार्यान्वित करेगा जो आपके पीसी पर सिस्टम के क्लाइंट पक्ष को लागू करेगा - एक वास्तविक सीरियल पोर्ट के रूप में दिखाई देगा, लेकिन वास्तव में सर्वर पर सब कुछ बंद कर देगा। आप इस ड्राइवर को अपने वास्तविक स्टैंडअलोन सीरियल पोर्ट सर्वर के समर्थन में डिजी, लैंट्रोनिक्स आदि से मुफ्त में प्राप्त करने में सक्षम हो सकते हैं।

फिर आप किसी अन्य प्रोग्राम में कनेक्शन के सर्वर साइड को स्थानीय रूप से लागू करेंगे - जिससे क्लाइंट को डेटा और कंट्रोल कमांड को आवश्यकतानुसार जोड़ने और जारी करने की अनुमति मिल सके।

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

लिनक्स सीरियल पोर्ट ड्राइवर को संशोधित करें

वैकल्पिक रूप से, लिनक्स के लिए सीरियल पोर्ट ड्राइवर स्रोत आसानी से उपलब्ध है। ले लो, हार्डवेयर नियंत्रण टुकड़े, और एक ड्राइवर है कि दो / dev / ttySx बंदरगाहों, एक साधारण लूपबैक के रूप में चलाते हैं। फिर अपने वास्तविक कार्यक्रम को ttyS2 और अपने सिम्युलेटर को अन्य ttySx से कनेक्ट करें।

दो USB <-> सीरियल केबल का उपयोग लूपबैक में करें

लेकिन अभी सबसे आसान काम है? दो सीरियल पोर्ट USB उपकरणों पर $ 40 खर्च करें, उन्हें एक साथ तार करें (नल मॉडेम) और वास्तव में दो वास्तविक सीरियल पोर्ट हैं - एक जो आप परीक्षण कर रहे हैं, एक आपके सिम्युलेटर के लिए।

-Adam


1
वास्तव में अशक्त मॉडेम USB UART केबल मेरे लिए एक बहुत ही सुंदर समाधान की तरह लगते हैं क्योंकि यह दोनों स्थानीय परीक्षण (यदि आप बंदरगाहों पर कम हैं तो USB हब प्राप्त करें) और दूरस्थ डिबगिंग का समर्थन करते हैं।
मैक्सथन चान

मैंने इसकी गुणवत्ता की समीक्षा नहीं की है, लेकिन ttynvt Linux RUSE के माध्यम से RFC 2217 लागू करता है
डैनियल सैंटोस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.