首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XMODEM for python

XMODEM for python
EN

Stack Overflow用户
提问于 2008-12-11 04:49:05
回答 6查看 9.8K关注 0票数 2

我正在编写一个需要使用XMODEM从传感器设备传输数据的程序。我希望避免编写自己的XMODEM代码,所以我想知道是否有人知道是否有可用的python XMODEM模块?

EN

回答 6

Stack Overflow用户

发布于 2009-04-01 12:40:00

代码语言:javascript
复制
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
票数 5
EN

Stack Overflow用户

发布于 2011-03-05 00:37:34

在PyPi上有一个XMODEM模块。它使用XModem处理数据的发送和接收。下面是它的用法示例:

代码语言:javascript
复制
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()
票数 2
EN

Stack Overflow用户

发布于 2008-12-11 04:56:57

我认为你被困在自己的滚动中了。

您可以使用sz,它实现了X/Y/ZMODEM。您可以调用二进制文件,或者将必要的代码移植到Python。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/358471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档