¿Puedo usar el protocolo xmodem con PySerial?

Tengo una conexión activa con mi dispositivo serie a través de PySerial, pero también quiero transferir archivos a través del protocolo xmodem como parte de mi progtwig.

¿Cuál sería la forma más neutral de hacer esto? En el peor de los casos, podría close() mi objeto serial.Serial en Python y usar el subprocess para llamar a /usr/bin/sb , pero eso parece poco elegante.

Actualmente estoy en Ubuntu 9.10 y estoy usando un adaptador USB-TTY.

¿Algunas ideas?

Hay un módulo xmodem en PyPi. Se requieren dos funciones en el constructor para leer y escribir datos, implementarlos para que funcionen con su puerto serie abierto. A continuación se muestra una muestra simple de su uso:

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

No estoy familiarizado con los detalles del protocolo xmodem, pero una persona que responde la pregunta xmodem-para-python parece ser, e incluso ha proporcionado lo que parece ser una implementación burda de xmodem en Python. Quizás podrías usar eso, o ideas de otros, las respuestas allí.

Es súper simple usar la implementación del protocolo XMODEM que se encuentra en PyPi. Algunas cosas a tener en cuenta sobre el ejemplo anterior es que hay algunas cosas que no son necesarias. (¿Quizás esto funcionó para el autor o con una versión anterior del módulo?)

La documentación que se encuentra aquí es extremadamente útil, así que no dejes que te asuste. Necesitará un remitente y un receptor obviamente, y como no sé cuál será el script de Python, aquí hay dos ejemplos que he probado y que están trabajando a continuación. (básicamente copiado y pegado de los ejemplos en 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) 

Para recibir desde el dispositivo serie:

 stream = open('output', 'wb') modem.recv(stream, crc_mode=0) 

Para enviar al dispositivo serie:

 stream = open('input', 'rb') modem.send(stream) 

La clave aquí es asegurarse de que la velocidad en baudios esté configurada en ambos lados (por defecto aquí). NO agregue ningún retraso o suspensión, ya que no se basa en el tiempo, sino en transacciones. Las impresiones le permitirán ver la transacción en tiempo real a medida que los datos entran o salen del archivo / puerto serie.