2009-02-03 17 views
5

मेरे एम्बेडेड डिवाइस के साथ संचार का मेरा एकमात्र तरीका एक सीरियल पोर्ट है। डिफ़ॉल्ट रूप से, एम्बेडेड लिनक्स टर्मिनल के रूप में इस पोर्ट का उपयोग करता है। मैं इस टर्मिनल को कैसे अक्षम करूं और बाइनरी डेटा को स्थानांतरित करने के लिए सीरियल लिंक का उपयोग कैसे करूं? मैंने आरएक्स और टीएक्स जैसे आदेशों के बारे में सुना लेकिन मैं उन्हें नहीं ढूंढ सकता।धारावाहिक टर्मिनल पर बाइनरी डेटा

मुझे लगता है कि मैं सिर्फ() से पढ़ने और लिखने() के लिए/dev/tty सामान सकते हैं, लेकिन मुझे यकीन है कि कोई त्रुटि संदेश या मेरी डाटा प्रवाह के साथ जो कुछ भी गड़बड़ बनाना चाहते हैं।

उत्तर

3

आप किसी टर्मिनल पर फ़ाइल स्थानांतरित करने के लिए xmodem जैसे एप्लिकेशन का उपयोग कर सकते हैं। क्या सीरियल पोर्ट आप टर्मिनल से बात करते हैं, या यह कर्नेल कंसोल भी है।

आप कर रहे हैं गिरी शोर नहीं है, तो आप अपने वर्तमान कनेक्शन हस्तांतरण की तरह xmodem बनाने के लिए उपयोग कर सकते हैं। मेजबान तरफ, आप किर्मिट का उपयोग कर सकते हैं, जो कि अच्छा और पठनीय है।

आप अपने सीरियल पोर्ट कच्चे बनाना चाहते हैं, और आप फ़ाइल वर्णनकर्ता ttyfd खोला है, तो यहां एक तरह से यह करने के लिए है:

struct termios tty, orig_tty; 

... 

if(tcgetattr(ttyfd, &tty) < 0) 
{ 
    // error checking 
} 
// backup tty, make it raw and apply changes 
orig_tty = tty; 
cfmakeraw(&tty); 
if(tcsetattr(ttyfd, TCSAFLUSH, &tty) < 0) 
{ 
    // error checking 
} 

... 
//end of program or error path : 
tcsetattr(ttyfd, TCSAFLUSH, &orig_tty) 

मत भूलना के अंत में सेटिंग बहाल करने के लिए आपका प्रोग्राम यदि आप अभी भी एक अच्छा व्यवहार टर्मिनल चाहते हैं।

3

क्या आप टर्मिनल को कच्चे में सेट नहीं कर सकते?

this tutorial पर एक नज़र डालें।

2

आप टर्मिनल पर एक कमांड चला सकते हैं जो डेटा को एप्लिकेशन-स्तरीय प्रोटोकॉल के माध्यम से स्थानांतरित करेगा। आरएक्स और टीएक्स कमांड जिन्हें आप XMODEM file transfer protocol लागू करने के लिए संदर्भित करते हैं। यह एक समाधान हो सकता है, यदि बाइनरी डेटा जिसे आप ट्रांसफर करना चाहते हैं, फाइलों के होते हैं, थ्रूपुट मांग कम होती है, और आप कमांड चलाने के व्यवस्थापकीय ओवरहेड को ध्यान में रखते हैं। वैकल्पिक रूप से, आप डेटा स्थानांतरण और टर्मिनल दोनों को संभालने के लिए सीरियल पोर्ट को मल्टीप्लेक्स करना चाहते हैं। सीरियल टर्मिनल ड्राइवर कमांड (गेट्टी) को अक्षम करें, और अपने डिवाइस पर आईपी कनेक्शन स्थापित करने के लिए सीरियल लाइन पर PPP प्रोटोकॉल चलाएं। फिर आप एसएसएच या टेलनेट के माध्यम से डिवाइस पर लॉगिन कर सकते हैं और आईपी सॉकेट के माध्यम से अपना डेटा ट्रांसफर कर सकते हैं।

1

हाँ, अपने सीरियल पोर्ट के सभी /dev/ttyxx में हैं। ध्यान दें कि /dev/tty एक शॉर्टकट है जो आपके वर्तमान टर्मिनल के लिए खड़ा है, न कि एक विशिष्ट धारावाहिक पोर्ट। अक्सर, ये रूट के स्वामित्व में होते हैं, और आपको अपने आवेदन से सीधे डिवाइस तक पहुंचने के लिए विशेषाधिकार प्राप्त करने की आवश्यकता होती है या adm समूह में होना आवश्यक है।

आप डिवाइस को chown डिवाइस पर ले सकते हैं ताकि आप इसे एक्सेस कर सकें। मुझे यकीन नहीं है कि डिवाइस स्वामित्व बदलने का नतीजा क्या है; आईआईआरसी, यह करना आसान है और अच्छी तरह से काम करता है। वैकल्पिक रूप से आपके प्रोग्राम को विशेषाधिकार प्राप्त स्थिति में लाने के लिए setuid का उपयोग करना है।

getty नाम के एक कार्यक्रम उपयोगकर्ताओं को एक सीरियल पोर्ट से लॉग इन करने देता है कि नहीं है। आपका inittab धारावाहिक बंदरगाहों पर getty शुरू करेगा ताकि लोग लॉगिन कर सकें।

आप getty अक्षम करना चाहते हैं। कुछ मामलों में, एक बंदरगाह प्रबंधक है जो ऐसा करने में मदद करता है।

कुछ मामलों में, आप को mgetty का उपयोग करने के लिए बदल सकते हैं, जो getty के संस्करण को नियंत्रित करने के लिए एक स्मार्ट और आसान है।

3

लिनक्स कंसोल को अक्षम करने के लिए आपको बूटलोडर द्वारा लिनक्स कमांड लाइन को बदलना होगा: कंसोल =/dev/ttyS? से: कंसोल = शून्य

2

के रूप में अन्य नोट निहित है, वहाँ जाँच करने के लिए कई चीजें, यहां एकत्र कर रहे हैं:

  1. यकीन है कि लिनक्स कर्नेल सीरियल पोर्ट का उपयोग नहीं कर रहा है। सुनिश्चित करें कि आपकी ग्रब फ़ाइल में बूटलोड कमांड पर कोई कंसोल = विकल्प नहीं है। यह आमतौर पर डिफ़ॉल्ट रूप से नहीं होता है।
  2. सुनिश्चित करें कि सीरियल पोर्ट पर कोई गेटी चल रहा है।/Dev/ttyS0 (सीरियल पोर्ट ए) के लिए प्रविष्टि के लिए/etc/inittab में देखें और यदि वहां है तो इसे टिप्पणी करें।
  3. सुनिश्चित करें कि/dev/ttyS0 आपकी प्रक्रिया द्वारा पठनीय और लिखने योग्य है। आप एक विशिष्ट उपयोगकर्ता बना सकते हैं जिसके तहत नियंत्रण प्रोग्राम चलाया जाता है, और जो/dev/ttyS0 का मालिक है, फिर chmod 700/dev/ttyS0। इससे यह सुनिश्चित करने में मदद मिलेगी कि कुछ अन्य उपयोगकर्ता/प्रोग्राम सीरियल पोर्ट का उपयोग करने का भी प्रयास नहीं करते हैं।
  4. एक एफडी प्राप्त करने के लिए ttyS0 पर खुले() का उपयोग करें, फिर लाइन की गति और अनुशासन सेट करने के लिए दिनचर्या के tcsetattr परिवार का उपयोग करें।

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

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