2

PySerialを介してシリアルデバイスと正常に接続していますが、プログラムの一部としてxmodemプロトコルを介してファイルを転送したいと考えています。

これを行うための最もプラットフォームに中立な方法はどれですか?最悪の場合、Pythonでオブジェクトを呼び出して呼び出すclose()ことができますが、それはエレガントではないようです。serial.Serialsubprocess/usr/bin/sb

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

何か案は?

4

3 に答える 3

4

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()
于 2011-03-04T17:26:25.193 に答える
2

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)

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

于 2018-12-08T02:20:13.070 に答える
0

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

于 2009-12-03T22:03:28.250 に答える