Domanda

ho una connessione a lavorare con il mio dispositivo seriale tramite pySerial, ma voglio anche trasferire file tramite il protocollo xmodem come parte del mio programma.

Quale sarebbe il modo più indipendente dalla piattaforma per fare questo? Nel peggiore dei casi, ho potuto close() mio oggetto serial.Serial in Python e usare subprocess invitare /usr/bin/sb, ma che sembra poco elegante.

Al momento sono su Ubuntu 9.10 e sto usando un adattatore USB-TTY.

Tutte le idee?

È stato utile?

Soluzione

C'è modulo xmodem su Cheese Shop. Ci vogliono due funzioni in costruzione per leggere e scrivere dati, implementare loro di lavorare con la porta seriale aperta. Qui di seguito è semplice campione del suo utilizzo:

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

Altri suggerimenti

E 'super semplice da usare l'implementazione del protocollo XMODEM trovato su Cheese Shop. Un paio di cose da notare circa l'esempio di cui sopra è che ci sono alcune cose che non sono necessari. (Forse questo ha lavorato per l'autore o con una versione precedente del modulo?)

La documentazione trovato qui è estremamente utile, in modo da non lasciare che ti spaventa. Avrete bisogno di un trasmettitore e un ricevitore, ovviamente, e dato che non so quale lo script Python sarà, ecco due esempi che ho testato e stanno lavorando al di sotto. (Sostanzialmente copiato e incollato dagli esempi su Cheese Shop)

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)

Per ricevere dal dispositivo seriale:

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

Per inviare al dispositivo seriale:

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

La chiave qui è per essere sicuri che la velocità di trasmissione è impostata su entrambi i lati (inadempiente qui). Non aggiungere qualsiasi ritardo o dormire in quanto questo non è il tempo base, ma sulla base delle transazioni. le stampe vi permetterà di vedere in tempo reale transazione come i flussi di dati dentro o fuori della porta file / seriale.

Non ho dimestichezza con i dettagli del protocollo xmodem, ma una persona che risponde al xmodem-per-python domanda sembra essere, e ha anche fornito quella che appare come un'implementazione di greggio xmodem in Python. Forse si potrebbe usare quello, o le idee da altri le risposte lì.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top