XMODEM для питона - PullRequest
       43

XMODEM для питона

2 голосов
/ 11 декабря 2008

Я пишу программу, которая требует использования XMODEM для передачи данных с сенсорного устройства. Я бы не хотел писать свой собственный код XMODEM, поэтому мне было интересно, кто-нибудь знает, есть ли где-нибудь модуль Python XMODEM?

Ответы [ 6 ]

5 голосов
/ 01 апреля 2009
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
2 голосов
/ 04 марта 2011

На 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()
1 голос
/ 11 декабря 2008

Вот ссылка на XMODEM документацию, которая будет полезна, если вам придется написать свою собственную. Он имеет подробное описание оригинальных XMODEM, XMODEM-CRC и XMODEM-1K.

Вы также можете найти этот c-код интересным.

1 голос
/ 11 декабря 2008

Я думаю, что вы застряли, катаясь самостоятельно.

Возможно, вы сможете использовать sz , который реализует X / Y / ZMODEM. Вы можете вызвать двоичный файл или перенести необходимый код на Python.

0 голосов
/ 05 ноября 2014

Существует модуль Python, который вы можете использовать -> https://pypi.python.org/pypi/xmodem

Вы можете увидеть протокол передачи в http://pythonhosted.org//xmodem/xmodem.html

0 голосов
/ 11 декабря 2008

Вы можете попробовать использовать SWIG для создания привязок Python для библиотек C, указанных выше (или любых других библиотек C / C ++, которые вы можете найти в Интернете). Это позволит вам использовать тот же C API напрямую из Python.

Фактическая реализация, конечно, все еще будет на C / C ++, поскольку SWIG просто создает привязки к интересующим функциям.

...