2010-10-06 14 views
10

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

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

यह संभव/आम सहभागी एक स्क्रिप्ट के साथ minicom की तरह एक सांत्वना अनुप्रयोग को नियंत्रित करने के है? यदि नहीं, तो मॉडेम एटी कमांड का उपयोग कैसे करें सीखने के लिए मेरे लिए कुछ अच्छे संसाधन क्या हैं? या क्या वहां कोई और संसाधन है जो मेरे लिए चीजों को सरल बना सकता है?

उत्तर

4

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

मैं कुछ मानक प्रोटोकॉल का उपयोग कर बाइनरी स्थानांतरण करने की जरूरत है, तो मैं आमतौर पर कमांड लाइन उपकरण गैर इंटरैक्टिव मोड में उपयोग करते हैं, और उन्हें अपने अजगर स्क्रिप्ट से अंडे।

यहाँ उपकरण मैं बनाया का कुछ हिस्सा है: कुछ इनपुट के लिए इंतज़ार कर xmodem के माध्यम से डेटा भेजने, यू-बूट करने के लिए एक कमांड भेजने और एक हस्तांतरण कर्मिट प्रोटोकॉल का उपयोग शुरू। मैं स्वचालित फ्लैशिंग और एम्बेडेड उपकरणों के परीक्षण के लिए इसका उपयोग करता हूं।

class Parser : 
    def __init__(self, sport_name): 
     self.currentMsg = '' 
     if sport_name : 
      self.ser = serial.Serial(sport_name, 115200) 
    def WaitFor(self, s, timeOut=None): 
     self.ser.timeout = timeOut 
     self.currentMsg = '' 
     while self.currentMsg.endswith(s) != True : 
      # should add a try catch here 
      c=self.ser.read() 
      if c != '' : 
       self.currentMsg += c 
       sys.stdout.write(c) 
      else : 
       print 'timeout waiting for ' + s 
       return False 
     return True 

    def XmodemSend(self,fname): 
     if not self.WaitFor('C', 1) : 
      print 'RomBOOT did not launch xmodem transfer' 
      return 
     self.ser.flushInput() 
     self.ser.close() 
     call(["xmodem","-d",self.ser.port,"-T",fname]) 
     self.ser.open() 

def UbootLoad(self, fname): 
    self.ser.write('loadb 0x20000000\n') 
    if not self.WaitFor('bps...',1) : 
     print 'loadb command failed' 
     sys.exit() 
    self.ser.flushInput() 
    self.ser.close() 
    retcode=call(['kermit','-y','kermit_init','-s',fname]) 
    if retcode != 0 : 
     print 'error sending' + fname 
     sys.exit() 
    self.ser.open() 
    self.UbootCmd('echo\n') 
+0

धन्यवाद! मैंने पाया कि मिनीकॉम में एक उपयोगिता है जिसे रनस्क्रिप्ट कहा जाता है, जो प्राथमिक लेकिन पर्याप्त है। हालांकि, इसे पोस्ट करने के लिए आपको बहुत बहुत धन्यवाद। मैं भविष्य में उपयोगी हो सकता हूं। – jasper77

2

यदि यह केवल डिवाइसों को नियंत्रित करने के बारे में है और कुछ भी नहीं (जैसे संदेशों को संसाधित करना, अन्य ऑपरेटिंग सिस्टम सेवाओं के साथ बातचीत करना आदि) तो आप chat प्रोग्राम का उपयोग कर सकते हैं। यह वास्तव में इसके लिए लिखा है। आप इसे किसी भी लिनक्स डिस्ट्रो पर ppp पैकेज में पा सकते हैं।

+0

मुझे चैट कार्यक्रम के बारे में बताने के लिए धन्यवाद। यह मेरी ज़रूरतों का हिस्सा बता सकता है, लेकिन मुझे वास्तव में खोलने से पहले इस डिवाइस पर एक नई लिनक्स छवि डाउनलोड और बूट करने में सक्षम होना चाहिए। डिवाइस व्यस्त बॉक्स का उपयोग करता है। – jasper77

2

मैं जो मैं RS232 नियंत्रित करने के लिए उपयोग करने के इस तरह के एक शक्ति नियंत्रक का उपयोग रहा है।

मैं स्क्रिप्ट यह जारी करके बस बैश का उपयोग कर:

echo "your-command" > /dev/ttyUSB0 

विशिष्ट डिवाइस मैं भी उपयोग कर रहा हूँ 300 बॉड दर का उपयोग करता है तो मैं जारी करते हैं:

stty -F /dev/ttyUSB0 300 

पहले से।

5

मैं runscript ("$ आदमी runscript"), एक उपयोगिता है कि minicom के लिए एक उम्मीद की तरह पटकथा योग्यता प्रदान करती है की खोज की। उम्मीद व्यवहार मेरे लिए उपयोगी है क्योंकि यह डिवाइस एक मालिकाना इंटरैक्टिव बूट अनुक्रम का उपयोग करता है। यह प्राथमिक है लेकिन पर्याप्त है। "-S स्क्रिप्टनाम" ध्वज के साथ मिनीकॉम शुरू करते समय एक स्क्रिप्ट को बुलाया जा सकता है, और स्क्रिप्ट के भीतर से विशिष्ट पाठ को लॉग फ़ाइल में भेजा जा सकता है, जो स्क्रिप्ट से मिनीकॉम चलाते समय उपयोगी होता है। मुझे लॉग में कंसोल सामग्री भेजने का कोई तरीका नहीं मिला है, इसलिए बाहरी स्क्रिप्ट होने के बारे में पता है कि मिनीकॉम के अंदर क्या हो रहा है, इसमें एक लॉग को लिखना और स्क्रिप्ट को लॉग मॉनीटर करना शामिल है। मैं केवल पायदान या पर्ल जैसे उच्च स्तरीय भाषा स्क्रिप्ट के भीतर, वास्तविक इंटरैक्शन के लिए डिवाइस को एसएसएच को पुनरारंभ करने और खोलने के लिए रनस्क्रिप्ट का उपयोग करने की योजना बना रहा हूं।यदि मिनीकॉम पहले से ही नहीं था, तो मैं shodanex के दृष्टिकोण ले जाएगा।

रनस्क्रिप्ट में घोंसला की उम्मीद नहीं हो सकती है। मैं गोटो के और लेबल का उपयोग करके यह चारों ओर हो गया है, जो यकीनन वैसे भी नेस्टेड उम्मीद की तुलना में अधिक पठनीय है:

expect { 
    "Condition 1" goto lable1 
} 

lable1: 
    send "something" 
    expect { 
     "Condition 2" goto label2 
    } 
lable2: 
    # etcetera 
+0

सुधार: जब minicom "-C logfilename" के साथ आवेदित किया जाता है तो उस फ़ाइल में कंसोल आउटपुट कैप्चर किया जाता है। – jasper77

+1

आपके पास अपनी स्क्रिप्ट, "lable" बनाम "लेबल" में टाइपो हैं। –

+0

रनस्क्रिप्ट ठीक दिखता है लेकिन मुझे फ़ाइल भेजने का कोई तरीका नहीं दिख रहा था, इसलिए यह मेरे लिए है। – austinmarton

1

अजगर अब PySerial पुस्तकालय है: http://rubygems.org/gems/serialport

: http://pyserial.sourceforge.net/

रूबी serialport मणि है पर्ल शायद एक समान पुस्तकालय है, लेकिन मैं इसे खोजने में असमर्थ था।

मैं बहुत उपयोगी Arduino खेल का मैदान से इन दोनों की खोज की: http://playground.arduino.cc//Main/Interfacing

सीजे