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.
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()
Hay un módulo de Python que puede usar -> https://pypi.python.org/pypi/xmodem
Puede ver el protocolo de transferencia en http://pythonhosted.org//xmodem/xmodem.html