XMODEM を使用してセンサー デバイスからデータを転送する必要があるプログラムを作成しています。独自の XMODEM コードを作成する必要がないようにしたいので、python XMODEM モジュールがどこかで利用できるかどうか誰かが知っているかどうか疑問に思っていましたか?
9791 次
6 に答える
5
def xmodem_send(serial, file):
t, anim = 0, '|/-\\'
serial.setTimeout(1)
while 1:
if serial.read(1) != NAK:
t = t + 1
print anim[t%len(anim)],'\r',
if t == 60 : return False
else:
break
p = 1
s = file.read(128)
while s:
s = s + '\xFF'*(128 - len(s))
chk = 0
for c in s:
chk+=ord(c)
while 1:
serial.write(SOH)
serial.write(chr(p))
serial.write(chr(255 - p))
serial.write(s)
serial.write(chr(chk%256))
serial.flush()
answer = serial.read(1)
if answer == NAK: continue
if answer == ACK: break
return False
s = file.read(128)
p = (p + 1)%256
print '.',
serial.write(EOT)
return True
于 2009-04-01T12:40:00.007 に答える
2
PyPiにはXMODEMモジュールがあります。XModemを使用してデータの送信と受信の両方を処理します。以下はその使用例です。
import serial
try:
from cStringIO import StringIO
except:
from StringIO import StringIO
from xmodem import XMODEM, NAK
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 prepare new buffer and start sending it
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 initiates xmodem send from device\r\n")
sleep(0.02) # give device time to handle command and start sending response
readUntil(NAK)
buffer = StringIO()
XMODEM(getc, putc).recv(buffer, crc_mode = 0, quiet = 1)
contents = buffer.getvalue()
buffer.close()
readUntil()
于 2011-03-04T16:37:34.073 に答える
1
私はあなたが自分自身を転がすことにこだわっていると思います。
X/Y/ZMODEM を実装するszを使用できる場合があります。バイナリを呼び出すか、必要なコードを Python に移植することができます。
于 2008-12-11T04:56:57.217 に答える
0
使用できる python モジュールがあります -> https://pypi.python.org/pypi/xmodem
于 2014-11-05T10:09:10.057 に答える
0
SWIGを使用して、上記のリンク先の C ライブラリ (またはオンラインで見つけた他の C/C++ ライブラリ) の Python バインディングを作成することができます。これにより、同じ C API を Python から直接使用できるようになります。
SWIG は目的の関数へのバインディングを作成するだけなので、実際の実装はもちろん C/C++ のままです。
于 2008-12-11T07:26:04.873 に答える