문제

Pyserial을 통해 직렬 장치와의 연주 연결이 있지만 프로그램의 일부로 Xmodem 프로토콜을 통해 파일을 전송하고 싶습니다.

이것을하는 가장 플랫폼 중립적 인 방법은 무엇입니까? 최악의 경우, 나는 할 수있다 close() 나의 serial.Serial 파이썬의 물체 및 사용 subprocess 전화합니다 /usr/bin/sb, 그러나 그것은 부적절 해 보인다.

저는 현재 Ubuntu 9.10에 있고 USB-Tty 어댑터를 사용하고 있습니다.

어떤 아이디어?

도움이 되었습니까?

해결책

PYPI에는 Xmodem 모듈이 있습니다. 데이터를 읽고 쓰기 위해 생성자의 두 가지 기능이 필요하며 열린 직렬 포트와 함께 작동하도록 구현합니다. 아래는 사용법의 간단한 샘플입니다.

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

다른 팁

PYPI에서 발견 된 xmodem 프로토콜 구현을 사용하는 것은 매우 간단합니다. 위의 예에 대해 주목해야 할 몇 가지 사항은 필요하지 않은 것들이 있다는 것입니다. (아마도 이것은 저자 또는 이전 버전의 모듈에서 효과가 있었습니까?)

문서 여기에서 찾았습니다 매우 도움이되므로 두려워하지 마십시오. 당신은 분명히 발신자와 수신기가 필요하며, 파이썬 스크립트가 어떤지 알지 못하기 때문에 다음은 테스트하고 아래에서 작동하는 두 가지 예입니다. (기본적으로 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)

직렬 장치로부터 수신하려면 :

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

직렬 장치로 보내기 :

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

여기서 핵심은 보드 속도가 양쪽에 설정되어 있는지 확인하는 것입니다 (여기서 기본값). 시간 기반이 아니라 거래 기반이므로 지연이나 수면을 추가하지 마십시오. 인쇄물을 사용하면 데이터가 파일/직렬 포트 안팎으로 흐르면 트랜잭션을 실시간으로 볼 수 있습니다.

나는 Xmodem 프로토콜의 세부 사항에 익숙하지 않지만 한 사람이 xmodem-for-python 질문은 Xmodem의 조잡한 구현처럼 보이는 것을 제공했습니다. 안에 파이썬. 아마도 당신은 그것을 사용하거나 다른 답변의 아이디어를 사용할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top