我可以将Xmodem协议与催眠作用吗?
题
我通过四义性词与串行设备有一个工作连接,但是我也想通过XMODEM协议传输文件作为程序的一部分。
哪个是最中性的方法?最坏的情况,我可以 close()
我的 serial.Serial
python中的对象并使用 subprocess
打电话 /usr/bin/sb
, ,但这似乎很不高。
我目前在Ubuntu 9.10上,正在使用USB-TTY适配器。
有任何想法吗?
解决方案
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()
其他提示
使用PYPI上的XMODEM协议实现非常简单。关于上面示例的一些事情要注意,有些不需要的事情。 (也许这适用于作者或以前的模块版本?)
文档 在这里找到 非常有帮助,所以不要让它吓到您。显然,您将需要一个发件人和一个接收器,并且由于我不知道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)
这里的关键是要确保双方设置了波特率(在此处默认)。不要添加任何延迟或睡眠,因为这不是基于时间,而是基于交易的。当数据流入或流出文件/串行端口时,这些打印件将使您可以实时查看事务实时。
我不熟悉Xmodem协议的详细信息,但是一个人回答 Xmodem-for-python 问题似乎是,甚至提供了看起来像是Xmodem的粗略实现 在 Python。也许您可以使用它,也可以从其他答案中提出想法。
不隶属于 StackOverflow