سؤال

لدي خادم Linux (Red Hat 4) مع اتصال منفذ تسلسلي واحد بجهاز Linux مضمن ، واتصال منفذ متسلسل آخر بوحدة تحكم الطاقة لهذا الجهاز. طريقتي الحالية للسيطرة عليها هي فتح جلستين صغيرتين ، كل منهما في نافذته الخاصة. أود أتمتة هذا الاتصال من خلال البرامج النصية. في البداية ، بدأت أفكر كيف يمكنني أتمتة استخدام Minicom ، ثم أدركت أنني لا ينبغي أن أحتاج إلى محاولة أتمتة استخدام تطبيق وحدة التحكم عندما يكون البرنامج النصي قادرًا على التحدث إلى المنفذ مباشرة.

أنا أعرف بعض بيرل وبعض بيثون. ليس لدي خبرة سابقة مع اتصال المودم (باستخدام الأوامر في). يحتوي Perl على جهاز :: مودم ، على الرغم من أنه بيتا فقط ، ويبدو أن بيرل خيار جيد لأنني أفضل استخراج النص وقدراته المشاحبة. ولكن ، إذا كنت بحاجة إلى تعلم كيفية التحكم في مودم وكتابة/تصحيح نص ، فإن هذا يضيف المزيد من الوقت إلى مهمتي.

هل من الممكن/الشائع التحكم بشكل تفاعلي في تطبيق وحدة تحكم مثل Minicom مع البرنامج النصي؟ إذا لم يكن الأمر كذلك ، فما هي بعض الموارد الجيدة بالنسبة لي لمعرفة كيفية استخدام المودم في الأوامر؟ أم أن هناك مورد آخر يمكن أن يبسط الأشياء بالنسبة لي؟

هل كانت مفيدة؟

المحلول

Kermit هو تطبيق اتصال متسلسل مثل Minicom وله لغة البرنامج النصي الخاصة به ، وقد استخدمته لبعض التحميل التلقائي على الأجهزة المدمجة. ومع ذلك ، فهي محدودة و/أو عربات التي تجرها الدواب ، لذلك تحولت أخيرًا إلى استخدام Python و Pyserial.
كلما تعاملت مع وضع Texte ، مثل AT AT Command Set أو التحدث إلى قذيفة عبر خط متسلسل ، فهو قوي حقًا.

إذا كنت بحاجة إلى القيام بنقل ثنائي باستخدام بعض البروتوكول القياسي ، فأنا عادةً ما أستخدم أدوات سطر الأوامر في الوضع غير التفاعلي ، وتفرخها من نص Python الخاص بي.

فيما يلي جزء من الأدوات التي قمت بإنشائها: في انتظار بعض المدخلات ، وإرسال البيانات عبر XModem ، وإرسال أمر إلى U-Boot وبدء نقل باستخدام بروتوكول Kermit. أستخدمه في الوميض التلقائي واختبار الأجهزة المدمجة.

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')

نصائح أخرى

لقد اكتشفت Runscript ("$ Man Runscript") ، وهي أداة تتمثل في إضافة قدرة نصية شبيهة بالتصنيع على minicom. إن السلوك المتوقع مفيد بالنسبة لي لأن هذا الجهاز يستخدم تسلسل التمهيد التفاعلي الخاص. انها بدائية ولكنها كافية. يمكن استدعاء البرنامج النصي عند بدء تشغيل Minicom باستخدام علامة "-S ScriptName" ، ويمكن إرسال نص محدد من داخل البرنامج النصي إلى ملف السجل ، وهو مفيد عند تشغيل Minicom من البرنامج النصي. لم أجد طريقة لإرسال محتوى وحدة التحكم إلى سجل ، لذا فإن وجود نص خارجي يعرف ما يجري داخل Minicom يتضمن الكتابة إلى سجل ومراقبة البرنامج النصي. أخطط لاستخدام Runscript فقط لإعادة التشغيل والوصول إلى قذيفة ، ثم SSH إلى الجهاز للتفاعل الحقيقي ، ضمن برنامج نصي لغة أعلى من المستوى مثل Python أو Perl. إذا لم يكن Minicom موجودًا بالفعل ، فسأخذ نهج Shodanex.

Runscript لا يمكن أن يتوقع المتداخل. لقد تجولت في هذا باستخدام Goto's والعلامات ، والتي يمكن القول أنها أكثر قابلية للقراءة مما يتوقعه Nested على أي حال:

expect {
   "Condition 1"  goto lable1
}

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

إذا كان الأمر يتعلق فقط بالتحكم في الأجهزة ولا شيء آخر (مثل معالجة الرسائل ، والتفاعل مع خدمات نظام التشغيل الأخرى ، إلخ) ، يمكنك استخدام دردشة برنامج. إنه مكتوب بالضبط لهذا الغرض. قد تجده في PPP حزمة على أي Linux Distro.

أنا أستخدم وحدة تحكم الطاقة هذه التي أستخدمها RS232 للتحكم.

أنا نصه باستخدام Bash ببساطة عن طريق إصدار:

echo "your-command" > /dev/ttyUSB0

يستخدم الجهاز المحدد الذي أستخدمه أيضًا 300 معدل باود ، لذا فإنني أصدر:

stty -F /dev/ttyUSB0 300

قبل اليد.

Python الآن لديه مكتبة Pyserial: http://pyserial.sourceforge.net/

روبي لديه جوهرة Serialport: http://rubygems.org/gems/serialport

ربما يكون لدى بيرل مكتبة مماثلة ، لكنني لم أتمكن من العثور عليها.

لقد اكتشفت كلاهما من ملعب Arduino المفيد للغاية:http://playground.arduino.cc//main/interfacing

CJ

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top