12

私は Linux サーバー (Red Hat 4) を持っており、組み込み Linux デバイスへの 1 つのシリアル ポート接続と、そのデバイスの電源コントローラーへの別のシリアル ポート接続を備えています。それらを制御する私の現在の方法は、2 つの minicom セッションをそれぞれのウィンドウで開くことです。この通信をスクリプトで自動化したいと考えています。最初は、minicom を使用して自動化する方法を考え始めましたが、スクリプトがポートと直接通信できる必要がある場合は、コンソール アプリケーションを使用して自動化を試みる必要がないことに気付きました。

私はいくつかの Perl といくつかの python を知っています。モデム通信 (AT コマンドを使用) の経験はありません。Perl には Device::Modem がありますが、これはベータ版にすぎません。Perl のテキスト抽出機能とラングリング機能が好きなので、Perl は良い選択のように思えます。しかし、モデムの制御方法やスクリプトの作成/デバッグ方法を学習する必要がある場合は、作業にさらに時間がかかります。

minicom のようなコンソール アプリをスクリプトでインタラクティブに制御することは可能ですか? そうでない場合、モデム AT コマンドの使用方法を学ぶのに役立つリソースは何ですか? または、私のために物事を簡素化できる別のリソースがありますか?

4

5 に答える 5

5

カーミットは minicom のようなシリアル通信アプリで、独自のスクリプト言語を備えており、組み込みデバイスでの自動アップロードに使用しました。ただし、かなり制限されているか、バグが多いため、最終的に python と pyserial の使用に切り替えました。
ATコマンドセットやシリアルラインを介したシェルとの会話など、テキストモードを扱うときはいつでも、それは本当に強力です.

標準プロトコルを使用してバイナリ転送を行う必要がある場合は、通常、非対話モードでコマンド ライン ツールを使用し、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')
于 2010-10-07T07:24:15.857 に答える
5

私は runscript ("$ man runscript") を発見しました。これは、期待に似たスクリプト機能を minicom に追加するユーティリティです。このデバイスは独自のインタラクティブなブート シーケンスを使用するため、予期される動作は便利です。初歩的ですが、十分です。「-S scriptname」フラグを使用して minicom を開始するときにスクリプトを呼び出すことができ、スクリプト内の特定のテキストをログ ファイルに送信できます。これは、スクリプトから minicom を実行するときに役立ちます。コンソールのコンテンツをログに送信する方法が見つからないため、外部スクリプトに minicom 内で何が起こっているかを知らせるには、ログに書き込み、スクリプトにログを監視させる必要があります。Python や Perl などの高レベル言語スクリプト内で、再起動してシェルに到達するためだけに runscript を使用してから、実際の対話のためにデバイスに SSH で接続する予定です。ミニコムがなかったら

Runscript に入れ子になった期待値を含めることはできません。goto とラベルを使用してこれを回避しました。これは、ネストされた予想よりも間違いなく読みやすいです。

expect {
   "Condition 1"  goto lable1
}

lable1:
    send "something"
    expect {
       "Condition 2"  goto label2
    }
lable2:
    # etcetera
于 2010-10-08T14:10:44.990 に答える
3

RS232 を使用して制御するような電源コントローラーを使用しています。

次のコマンドを発行するだけで、bash を使用してスクリプトを作成できます。

echo "your-command" > /dev/ttyUSB0

私が使用している特定のデバイスも 300 ボーレートを使用しているため、次を発行します。

stty -F /dev/ttyUSB0 300

事前に。

于 2010-10-07T10:15:20.087 に答える
2

デバイスを制御するだけで、他に何もない場合 (メッセージの処理、他のオペレーティング システム サービスとの対話など) は、チャットプログラムを使用できます。まさにこのために書かれています。Linux ディストリビューションのpppパッケージに含まれている場合があります。

于 2010-10-06T16:17:25.660 に答える
1

Python に PySerial ライブラリが追加されました: http://pyserial.sourceforge.net/

Ruby には SerialPort gem があります: http://rubygems.org/gems/serialport

Perl にも同様のライブラリがあると思われますが、見つけることができませんでした。

非常に便利な Arduino Playground からこれらの両方を発見しました: http://playground.arduino.cc//Main/Interfacing

CJ

于 2013-06-10T13:54:23.407 に答える