我通过PySerial与我的串行设备建立了连接,但我也希望通过xmodem协议传输文件作为我程序的一部分。
这是最平台中立的方式吗?最糟糕的情况是,我可以在close()
使用serial.Serial
对象在Python中使用subprocess
来调用/usr/bin/sb
,但这似乎不够优雅。
我目前使用的是Ubuntu 9.10并使用USB-TTY适配器。
有什么想法吗?
答案 0 :(得分:4)
PyPi上有xmodem模块。构造函数中有两个函数用于读取和写入数据,实现它们以使用打开的串行端口。以下是其用法的简单示例:
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()
答案 1 :(得分:0)
我不熟悉xmodem协议的细节,但有人回答xmodem-for-python问题似乎是,甚至提供了看起来像中的xmodem 的粗略实现> Python。也许你可以使用它,或者那里的其他答案的想法。
答案 2 :(得分:0)
使用PyPi上的XMODEM协议实现非常简单。关于上面的示例需要注意的几件事是有些事情是不需要的。 (也许这适用于作者或该模块的先前版本?)
文档found here很有帮助,所以不要让它吓到您。显然,您将需要一个发送者和一个接收者,并且由于我不知道Python脚本是哪个脚本,因此下面是我已经测试并在下面工作的两个示例。 (基本上是从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)
此处的关键是确保在两侧都设置波特率(此处为默认值)。不要添加任何延迟或睡眠,因为这不是基于时间的,而是基于事务的。当数据流入文件/串行端口或从文件/串行端口流出时,打印件将使您实时查看事务。