質問

Pyserialを介してシリアルデバイスと動作する接続がありますが、プログラムの一部としてXmodemプロトコルを介してファイルを転送したいと考えています。

これを行うための最もプラットフォーム中立的な方法はどれですか?最悪の場合、私はできました close() 私の serial.Serial Pythonのオブジェクトと使用 subprocess 呼び出すために /usr/bin/sb, 、しかし、それは不可分なようです。

私は現在Ubuntu 9.10を使用しており、USB-TTYアダプターを使用しています。

何か案は?

役に立ちましたか?

解決

PypiにはXmodemモジュールがあります。データを読み書きするためにコンストラクターに2つの機能が必要です。それらを実装して、開いたシリアルポートで動作します。以下は、その使用法の単純なサンプルです。

import serial
try:
    from cStringIO import StringIO
except:
    from StringIO import StringIO
from xmodem import XMODEM, CRC
from time import sleep

def readUntil(char = None):
    def serialPortReader():
        while True:
            tmp = port.read(1)
            if not tmp or (char and char == tmp):
                break
            yield tmp
    return ''.join(serialPortReader())

def getc(size, timeout=1):
    return port.read(size)

def putc(data, timeout=1):
    port.write(data)
    sleep(0.001) # give device time to send ACK


port = serial.Serial(port='COM5',parity=serial.PARITY_NONE,bytesize=serial.EIGHTBITS,stopbits=serial.STOPBITS_ONE,timeout=0,xonxoff=0,rtscts=0,dsrdtr=0,baudrate=115200)
port.write("command that loads data via xmodem\r\n")
sleep(0.02) # give device time to handle command
readUntil(CRC)
buffer = StringIO('data to send')
XMODEM(getc, putc).send(buffer, quiet = 1)
buffer.close()
readUntil()

他のヒント

PYPIで見つかったXmodemプロトコルの実装を使用するのは非常に簡単です。上記の例について注意すべきことは、必要ではないものがいくつかあることです。 (たぶん、これは著者のために機能したのでしょうか、それとも以前のバージョンのモジュールで機能しましたか?)

ドキュメント ここにあります 非常に役立つので、怖がらせないでください。明らかに送信者とレシーバーが必要になります。Pythonスクリプトがどれであるかわからないので、以下にテストし、以下で動作している2つの例を紹介します。 (基本的にPypiの例からコピーして貼り付けられています)

import serial
from xmodem import XMODEM

ser = serial.Serial(port='COM56')


def getc(size, timeout=8):
    gbytes = ser.read(size)
    print(f'Read Byte: {gbytes}')
    return gbytes or None


def putc(data, timeout=8):
    pbytes = ser.write(data)
    print(f'Put Byte: {pbytes}')
    return pbytes or None


if __name__ == '__main__':
    modem = XMODEM(getc, putc)

シリアルデバイスから受信するには:

stream = open('output', 'wb')
modem.recv(stream, crc_mode=0)

シリアルデバイスに送信するには:

stream = open('input', 'rb')
modem.send(stream)

ここでの重要なのは、ボーレートが両側に設定されていることを確認することです(ここでデフォルトでデフォルト)。これは時間ベースではなく、トランザクションベースであるため、遅延や睡眠を追加しないでください。印刷により、データがファイル/シリアルポートに出入りするため、トランザクションをリアルタイムで確認できます。

私はXmodemプロトコルの詳細に精通していませんが、1人の人に答えています Xmodem-for-python 質問はあるように見え、Xmodemの粗い実装のように見えるものさえ提供しました Python。おそらく、それを使用したり、他の答えからのアイデアを使用することもできます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top