Pregunta

Tengo una conexión a trabajar 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 programa.

¿Cuál sería la forma más independiente de la plataforma para hacer esto? Peor de los casos, podría close() mi objetivo serial.Serial en Python y utilizar subprocess hacer un llamamiento a /usr/bin/sb, pero que parece poco elegante.

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

¿Alguna idea?

¿Fue útil?

Solución

Hay módulo XMODEM en PyPi. Se necesitan dos funciones de constructor para leer y escribir datos, ponerlas en práctica para trabajar con su puerto serie abierta. A continuación se 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()

Otros consejos

Es muy sencillo de utilizar la implementación del protocolo XMODEM encontrado en PyPi. Un par de cosas a tener en cuenta sobre el ejemplo anterior es que hay algunas cosas que no son necesarios. (Tal vez esto trabajó para el autor o con una versión anterior del módulo?)

La documentación encontrado aquí es extremadamente útil, así que no dejes que te asuste. Se necesita un emisor y un receptor, obviamente, y puesto que no sé cuál será la secuencia de comandos de Python, aquí hay dos ejemplos que he probado y están trabajando por debajo. (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 de 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 se establece en ambos lados (morosos aquí). No añada ningún retraso o dormir ya que esto no es basada en el tiempo, pero sobre la base de transacciones. las impresiones se permitirá ver el tiempo real de transacción como los flujos de datos dentro o fuera del puerto archivo / serie.

No estoy familiarizado con los detalles del protocolo XMODEM, pero una persona que conteste el XMODEM-para-pitón pregunta parece ser, e incluso ha proporcionado lo que parece una aplicación crudo de XMODEM en Python. Tal vez usted podría utilizar eso, o ideas de otros las respuestas allí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top