xticks pyplot python serial-port file-transfer xmodem

pyplot - XMODEM para python



pyplot title (6)

Estoy escribiendo un programa que requiere el uso de XMODEM para transferir datos desde un dispositivo sensor. Me gustaría evitar tener que escribir mi propio código XMODEM, así que me preguntaba si alguien sabía si había un módulo Python XMODEM disponible en algún lugar.


Aquí hay un enlace a la documentación de XMODEM que será útil si tiene que escribir el suyo. Tiene una descripción detallada del XMODEM original, XMODEM-CRC y XMODEM-1K.

También puede encontrar este c-código de interés.


Creo que estás atascado con el tuyo.

Es posible que pueda usar sz , que implementa X / Y / ZMODEM. Podría llamar al binario o transferir el código necesario a Python.


Puede intentar usar SWIG para crear enlaces de Python para las bibliotecas de C vinculadas anteriormente (o cualquier otra biblioteca de C / C ++ que encuentre en línea). Eso le permitirá usar la misma API de C directamente desde Python.

La implementación real, por supuesto, seguirá estando en C / C ++, ya que SWIG simplemente crea enlaces a las funciones de interés.


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


Hay un módulo XMODEM en PyPi. Maneja tanto el envío como la recepción de datos con XModem. A continuación se muestra una muestra de su uso:

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()