2008-12-11 3 views
2

Я пишу программу, которая требует использования XMODEM для передачи данных с сенсорного устройства. Я бы хотел, чтобы не писать собственный код XMODEM, поэтому мне было интересно, знает ли кто-нибудь, есть ли доступный где-нибудь модуль Python XMODEM?XMODEM для python

ответ

1

Я думаю, вы застряли в сворачивании своих собственных.

Возможно, вы используете sz, который реализует X/Y/ZMODEM. Вы можете обратиться к двоичному файлу или перенести необходимый код на Python.

1

Здесь приведена ссылка на документацию XMODEM, которая будет полезна, если вам нужно написать свой собственный. Он содержит подробное описание оригинальных XMODEM, XMODEM-CRC и XMODEM-1K.

Вы также можете найти это c-code интересов.

0

Вы можете попробовать использовать SWIG для создания привязок Python для библиотек C, связанных выше (или любых других библиотек C/C++, которые вы найдете в Интернете). Это позволит вам использовать один и тот же API C непосредственно из Python.

Фактическая реализация, конечно же, будет по-прежнему находиться на C/C++, поскольку SWIG просто создает привязки к интересующим функциям.

5
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 
2

В PyPi имеется модуль XMODEM. Он обрабатывает как отправку, так и прием данных с помощью XModem. Ниже приведен пример его использования:

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() 
Смежные вопросы