इको और कैट का उपयोग करके सीरियल लूपबैक का अप्रत्याशित परिणाम परीक्षण


18

इसलिए मेरे पास एक मानक RS232 सीरियल पोर्ट है जो केवल टीएक्स से आरएक्स तक एक तार चलाकर खुद को वापस पाला जाता है। मैं दो अलग-अलग टर्मिनलों पर echoऔर चलाकर लूपबैक का परीक्षण कर रहा हूं cat:

cat /dev/ttyS1
echo "hi" > /dev/ttyS1

मेरा मुद्दा आउटपुट के साथ है। मैं टर्मिनल रनिंग कैट पर एक "हाय" देखने आने की उम्मीद करूंगा लेकिन इसके बजाय मुझे यह मिल गया:

hi
[2 newlines]
hi
[4 newlines]
hi
[8 newlines]
hi
[16 newlines]
hi
[32 newlines]
hi

... और इसी तरह जब तक मैं ctrl+ c cat

बिल्ली को बाधित करने के बाद, अगर मैं इसे फिर से चलाता हूं तो यह दूसरी बार ईको चलाने तक "हाय" का उत्पादन नहीं करेगा।

क्या यह सामान्य है? किसी भी विचार क्यों मैं इस व्यवहार देख रहा हूँ?

संपादित करें : न्यूलाइन द्वारा, मेरा मतलब है ASCII 0x0A। इस आउटपुट में कोई गाड़ी रिटर्न नहीं है।


क्या यह एक ही उपकरण को खोलने वाली दो प्रक्रियाओं के कारण हो सकता है? क्या होगा यदि आप tip /dev/ttyS1( ~.बाहर निकलने के लिए) दौड़ते हैं और वहाँ डेटा टाइप करने की कोशिश करते हैं? यह आपके टर्मिनल में प्रदर्शित होना चाहिए जब तार जुड़ा हुआ है, क्योंकि यह प्राप्त करता है कि यह क्या प्रसारित है।
mrb

3
क्या तुम सच में newlines, या एक गाड़ी वापसी / newline जोड़ी हो रही है? आप जिस स्तर पर काम कर रहे हैं, उसमें अंतर महत्वपूर्ण है। कोशिश "बिल्ली / देव / ttyS1> somefile" तो "od -x somefile" करते हैं यह देखने के लिए कि वास्तव में TTY डिवाइस फ़ाइल से क्या बाइट्स निकल रहे हैं। इसके अलावा, "स्ट्टी-एफ / देव / ट्टीएस 1-ए" करें। "स्ट्टी" के लिए मैन पेज पढ़ें और स्टेंट का आउटपुट आपको बताए, हर छोटी सेटिंग के लिए देखें। RS232 धारावाहिक कॉमिक्स मुश्किल हैं।
ब्रूस एडिगर जूल

जवाबों:


21

ब्रूस की दूसरी टिप्पणी के लिए धन्यवाद, मैं अपने दम पर समस्या का पता लगाने में सक्षम था।

दौड़ने के बाद stty -a -F /dev/ttyS1, मुझे समस्या में योगदान करने के लिए 3 विकल्प मिले: "इको", "ओनलक्र", और "इक्रनल"।

चूंकि यह धारावाहिक बंदरगाह अपने आप में ही लुप्त हो चुका है, यहाँ पर दौड़ने के बाद क्या हुआ है echo "hi" > /dev/ttyS1:

  1. echoआदेश डिफ़ॉल्ट रूप से संदेश के अंत में एक नई पंक्ति है, तो "हाय" + वामो बाहर / dev / ttyS1 को भेजा जाता है संलग्न कर देता है
  2. क्योंकि "onlcr" सेट किया गया था, सीरियल डिवाइस ने LF को CRLF में बदल दिया था, इसलिए Tx लाइन से बाहर भेजे गए भौतिक संदेश "hi" + CRLF थे
  3. क्योंकि "icrnl" सेट किया गया था, Rx लाइन पर प्राप्त भौतिक गड़बड़ ने CR को LF में बदल दिया। इसलिए 'बिल्ली' द्वारा उत्पादित संदेश "हाय" + एलएफएलएफ था।
  4. क्योंकि "इको" सेट किया गया था, आरएक्स ("हाय" + एलएफएलएफ) पर प्राप्त संदेश, फिर टीएक्स लाइन पर वापस भेज दिया गया था।
  5. Onlcr के कारण, "hi" + LFLF "hi" + CRLFCRLF बन गया।
  6. Icrnl के कारण, "hi" + CRLFCRLF "hi" + LFLFLFLF बन गया
  7. प्रतिध्वनि के कारण, "hi" + LFLFLFLF को तब Tx बाहर भेजा गया था

और इसी तरह...

इस समस्या को ठीक करने के लिए, मैंने निम्नलिखित कमांड चलाई:

stty -F /dev/ttyS1 -echo -onlcr

"इको" को अक्षम करना संदेशों के अनंत लूप को रोकता है और "onlcr" को अक्षम करने से सीरियल डिवाइस को आउटपुट पर LF से CRLF में परिवर्तित होने से रोकता है। अब catहर बार मुझे चलाने के लिए एक "हाय" (एक नई पंक्ति के साथ!) प्राप्त होता है echo

सीआर = गाड़ी वापसी (ASCII 0x0D); LF = लाइन फीड या न्यूलाइन (ASCII 0x0A)


-icrnlमेरे लिए चाल चली।
tcpaiva

3

मेरे पास एक समान मुद्दा था और साथ ही परीक्षण के लिए एक सीरियल ट्टी में समवर्ती फ़ाइलों के साथ। स्वीकृत उत्तर के अलावा:

यदि आप कुछ ऐसा करके धारावाहिक आउटपुट का परीक्षण कर रहे हैं: cat somefile.txt > /dev/ttyS0यदि आपके पास सटीक बाइट मानों के लिए परीक्षण किया जा रहा है , तो इसमें अप्रत्याशित बाइट डेटा की एक अच्छी मात्रा होगी।

साथ sttyएक सरल कर stty raw -F /dev/ttyS0सम्मिलित करने से टर्मिनल बंद हो जाएगा / पात्रों की जगह (जैसे [...] 0x0A [...]-> [...] 0x0D 0x0A [...])। rawझंडा टर्मिनल के तरीके बदल कर कोई इनपुट और आउटपुट प्रसंस्करण किया जाता है।


1
हम्म ... ऐसा नहीं लगता stty rawकि डिफ़ॉल्ट रूप से गूंज अक्षम हो जाएगी। आपको करने की आवश्यकता हो सकती है stty raw -echo
बीएमएनआर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.