我通过四义性词与串行设备有一个工作连接,但是我也想通过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。也许您可以使用它,也可以从其他答案中提出想法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top