सीरियल पोर्ट पर डेटा कैसे भेजें और कोई भी उत्तर देखें?


37

लिनक्स पर, मैं एक सीरियल पोर्ट (कंट्रोल कैरेक्टर वाले) के लिए कमांड स्ट्रिंग (यानी कुछ डेटा) भेजना चाहता हूं और प्रतिक्रिया सुनता हूं (जिसमें आमतौर पर कंट्रोल कैरेक्टर भी हो सकते हैं)।

मैं लिनक्स पर इसे यथासंभव सरल कैसे कर सकता हूं? एक उदाहरण की सराहना की है!


आप इस पर गौर करना चाहिए unix.stackexchange.com/a/116705/53092
Kiwy

मेरे पास इंटरसेप्ट्टी स्थापित नहीं है।
एलेक्स

फिर से खोलने के लिए नामांकन - यह सुझाव के अनुसार एक डुप्लिकेट नहीं है।
पीटर

कुछ लोग बहुत ज्यादा बेवकूफ होते हैं, वे सिर्फ सवाल पूछते हैं। पहले प्रश्नों और उत्तर को पढ़ने में परेशान करें।
डेनिस

जवाबों:


54

यूनिक्स पर सभी उपकरणों को एक डिवाइस फ़ाइल में मैप किया जाता है, सीरियल पोर्ट होगा /dev/ttyS0 /dev/ttyS1...।

पहले उस फ़ाइल की अनुमतियों पर एक नज़र डालें, मान लें कि आप उपयोग कर रहे हैं /dev/ttyS1

ls -l /dev/ttyS1

आप read.write पहुंच चाहते हैं, अगर यह एक साझा प्रणाली है तो आपको इसे सभी के लिए खोलने के सुरक्षा परिणामों पर विचार करना चाहिए।

chmod o+rw /dev/ttyS1

फ़ाइल को लिखने के लिए एक बहुत ही सरल क्रूड विधि, सरल echoकमांड का उपयोग करेगी ।

echo -ne '\033[2J' > /dev/ttyS1

और पढ़ने के लिए

cat -v < /dev/ttyS1

आपके पास एक टर्मिनल में चल रहा है, और एक 2 में गूंज सकता है।

यदि सब कुछ अस्पष्ट है, तो बॉड दर, बिट सेटिंग्स को भेजने से पहले आपको सेटिंग की आवश्यकता हो सकती है। sttyवह करेगा। !! नोट stty प्रभावित करने के लिए डिफ़ॉल्ट फ़ाइल डिस्क्रिप्टर के रूप में stdin का उपयोग करेगा।

समतुल्य आज्ञा।

stty 19200 < /dev/ttyS1
stty 19200 -F /dev/ttyS1

यह आपके लिए कुछ स्क्रिप्ट और लॉग इन करने के लिए पर्याप्त हो सकता है? सुनिश्चित नहीं हैं कि आप क्या हासिल करने की कोशिश कर रहे हैं।

अधिक संवादात्मक के लिए, आपके डिफ़ॉल्ट सेटिंग्स दृष्टिकोण को याद रखना minicomयह उपयोग करने के लिए होगा यह सिर्फ एक कार्यक्रम है जो मैंने अब तक उल्लेख किया है वह सब कुछ करता है। (विंडोज में हाइपरटेर्मिनल के समान, आप परिचित हो सकते हैं)।

एक मध्यवर्ती समाधान, एक टर्मिनल प्रोग्राम का उपयोग screenकरेगा , जो एक सीरियल डिवाइस पर काम करेगा।

screen /dev/ttyS1

man screen man minicom man stty अधिक जानकारी के लिए


मुझे कोई आउटपुट नहीं मिल रहा है। कोई विचार है?
गोल्डनेम

संभवतः हार्डवेयर प्रवाह नियंत्रण, या तो अटैच कमांड के साथ बंद हो जाता है या सीरियल केबल में हाई स्ट्रैप, नल मॉडेम केबल के लिए खोज।
एक्स तियान

1
# stty -speed 38400 -f /dev/ttyUSB1रिटर्नstty: invalid argument '-speed'
प्रो बैकअप

1
डिवाइस को सेट करने के लिए -F (कैपिटल एफ) स्टटी पर है। साथ ही आपका स्पीड पैरामीटर गलत है। आप इनपुट और आउटपुट स्पीड सेट करने के लिए पोर्ट की बॉड दर, या ispeed या ospeed (माइनस साइन के बिना) प्राप्त करने के लिए गति का उपयोग कर सकते हैं, या इनपुट और आउटपुट स्पीड दोनों को सेट करने के लिए बस एक संख्या, जैसे: स्टाइट 19200 -F देव / ttyS ....
पॉलस

कमाल किसी ने नहीं देखा कि पहले, धन्यवाद @Pro बैकअप मैंने उदाहरण को सही किया है।
एक्स तियान

11

आपको बस दो टर्मिनल खोलने हैं। पहले टर्मिनल में आप catडिवाइस से सब कुछ, जैसे

cat /dev/ttyS0

दूसरे टर्मिनल में, आप मनमाने ढंग से हेक्स कैरेक्टर और टेक्स्ट को टर्मिनल पर भेज सकते हैं जैसे कि:

echo -e "\x7E\x03\xD0\xAF und normaler Text" > /dev/ttyS0

echo -eआदेश बैकस्लैश पलायन की व्याख्या सक्षम बनाता है।

किसी को यह सुनिश्चित करना होगा कि (i) धारावाहिक सेटिंग्स (गति, शब्द लंबाई, प्रवाह ctrl, आदि) सही हैं और (ii) धारावाहिक उपकरण (दूसरे छोर पर) अवरुद्ध नहीं है।


ऊपर मैंने अपना जवाब लिखने के बाद आपने यह 10 मिनट का उत्तर दिया है और आपने आगे कोई जानकारी नहीं जोड़ी है!
एक्स तियान

ओह सॉरी, मैंने आपका जवाब पूरी तरह से नहीं पढ़ा। मैंने देखा कि मेरा उत्तर आप में शामिल है, इसलिए मैं आपके उत्तर को सही के रूप में स्वीकार करूंगा, जैसा आपने वर्णित किया है।
एलेक्स

मुझे COM पोर्ट के बारे में ज्यादा जानकारी नहीं है। क्या आप बता सकते हैं कि "सीरियल डिवाइस (दूसरे छोर पर) ब्लॉक नहीं हो रहा है" क्या मतलब है? फ़ायरवॉल के साथ कुछ समस्या?
सल्पाजो डी एरियेरेज़ सेप

9

कार्यक्रम जो धारावाहिक उपकरणों से बात करते हैं:

picocom
minicom
socat

या शेल से आप कर सकते हैं:

stty -speed 19200 < /dev/ttyS0 # sets the speed of the port
exec 99<>/dev/ttyS0 (or /dev/ttyUSB0...etc)
printf "AT\r" >&99
read answer <&99  # this reads just a CR
read answer <&99  # this reads the answer OK
exec 99>&-

तुम्हारा एक भयानक जवाब है कि मुझे द्विदिश फ़ाइल वर्णनकर्ताओं के बारे में सिखाया है। हालाँकि, क्या आप सुनिश्चित हैं कि डिस्क्रिप्टर को बंद करने की अंतिम पंक्ति वाक्य रचना सही है? मुझे सिंटैक्स त्रुटि मिलती है। मैं या तो लगता है exec 99<&-या exec 99>&-किया जाना चाहिए। या संभवतः दोनों?
यानिकी

1
टाइपो .. आप सही हैं
जिब्री

7

यह एक बेहतर तरीका हो सकता है:

stty -F /dev/ttyUSB0 115200 raw -echo   #CONFIGURE SERIAL PORT
exec 3</dev/ttyUSB0                     #REDIRECT SERIAL OUTPUT TO FD 3
  cat <&3 > /tmp/ttyDump.dat &          #REDIRECT SERIAL OUTPUT TO FILE
  PID=$!                                #SAVE PID TO KILL CAT
    echo "R" > /dev/ttyUSB0             #SEND COMMAND STRING TO SERIAL PORT
    sleep 0.2s                          #WAIT FOR RESPONSE
  kill $PID                             #KILL CAT PROCESS
  wait $PID 2>/dev/null                 #SUPRESS "Terminated" output

exec 3<&-                               #FREE FD 3
cat /tmp/ttyDump.dat                    #DUMP CAPTURED DATA

यह बहुत अच्छा है क्योंकि यह प्रक्रिया को स्वचालित करता है! एकमात्र बदलाव जो मैं करूंगा, जो पूरी तरह से वैकल्पिक है, प्राप्त सामग्री की पुष्टि करने के लिए भेजा गया समान है - केवल एक गिनती या पूर्ण रूप से भिन्न हो सकता है।
HiDefLoLife

4

आप एक डिवाइस को पढ़ सकते हैं और लिख सकते हैं, जैसे कि:

cat /dev/cu.usbmodem411 & cat > /dev/cu.usbmodem411

आपका संदेश दूसरे catसे भेजा जाता है stdin, और पहला आपके टर्मिनल को एक चैट रूम में बदलकर catप्रतिक्रिया के लिए रिले करता है stdout

समाप्त करने के लिए, ctrl-cहै, तो चलाने fgतो ctrl-cफिर।

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