Nov-07-2018, 07:42 AM
Thanks for reading my post.
Problem;
Cannot complete to receive a binary file with xmodem CRC (1024) mode.
Description;
Currently I try to download/receive a binary data file from a device (sender) via RS-232C to Raspberry Pi (receiver).
Typical filesize is 170 kByte.
Checksum type of the sender is XMODEM CRC(1024).
Therefore, I coded a python script refering sample codes on the internet as following:
There are some procedures to communicate with the sender;
1) In order to start communicate with the sender, input ">\r\n" is required.
2) after that, command "dat\r\n" is required to transfer the binary
data file from the sender.
3) Finally, command "end\r\n" to quit communication.
By executing the above script, only the first part of the binary file seems to be transfered
and the file seize is 1024 Byte which is quite equivalent to one data block size.
While executing, some error and warning messages are described in a logging.DEBUG output as following:
Problem;
Cannot complete to receive a binary file with xmodem CRC (1024) mode.
Description;
Currently I try to download/receive a binary data file from a device (sender) via RS-232C to Raspberry Pi (receiver).
Typical filesize is 170 kByte.
Checksum type of the sender is XMODEM CRC(1024).
Therefore, I coded a python script refering sample codes on the internet as following:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
import serial import time import logging from xmodem import XMODEM1k, NAK from time import sleep logging.basicConfig(level = logging.DEBUG) 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 ) port = serial.Serial(port = '/dev/ttyUSB0' ,parity = serial.PARITY_NONE,bytesize = serial.EIGHTBITS,stopbits = serial.STOPBITS_ONE,timeout = 0 ,xonxoff = 0 ,rtscts = 0 ,dsrdtr = 0 ,baudrate = 115200 ) port.write( ">\r\n" ) time.sleep( 2 ) port.write( "dat\r\n" ) time.sleep( 0.02 ) readUntil(NAK) buffer = open ( 'test' , 'wb' ) print XMODEM1k(getc, putc).recv( buffer ,crc_mode = 1 ,quiet = 1 ,timeout = 300 ) readUntil() port.write( "end\r\n" ) port.close() |
1) In order to start communicate with the sender, input ">\r\n" is required.
2) after that, command "dat\r\n" is required to transfer the binary
data file from the sender.
3) Finally, command "end\r\n" to quit communication.
By executing the above script, only the first part of the binary file seems to be transfered
and the file seize is 1024 Byte which is quite equivalent to one data block size.
While executing, some error and warning messages are described in a logging.DEBUG output as following:
Error:DEBUG:xmodem.XMODEM:recv error: putc failed, sleeping for 1
DEBUG:xmodem.XMODEM:recv: SOH
DEBUG:xmodem.XMODEM:recv: data block 1
WARNING:xmodem.XMODEM:recv error: expected SOH, EOT; got ''
WARNING:xmodem.XMODEM:recv error: expected SOH, EOT; got ''
WARNING:xmodem.XMODEM:recv error: expected SOH, EOT; got ''
WARNING:xmodem.XMODEM:recv error: expected SOH, EOT; got ''
WARNING:xmodem.XMODEM:recv error: expected SOH, EOT; got ''
WARNING:xmodem.XMODEM:recv error: expected SOH, EOT; got ''
WARNING:xmodem.XMODEM:recv error: expected SOH, EOT; got ''
WARNING:xmodem.XMODEM:recv error: expected SOH, EOT; got ''
WARNING:xmodem.XMODEM:recv error: expected SOH, EOT; got ''
WARNING:xmodem.XMODEM:recv error: expected SOH, EOT; got ''
WARNING:xmodem.XMODEM:recv error: expected SOH, EOT; got ''
WARNING:xmodem.XMODEM:recv error: expected SOH, EOT; got ''
WARNING:xmodem.XMODEM:recv error: expected SOH, EOT; got ''
WARNING:xmodem.XMODEM:recv error: expected SOH, EOT; got ''
WARNING:xmodem.XMODEM:recv error: expected SOH, EOT; got ''
WARNING:xmodem.XMODEM:recv error: expected SOH, EOT; got ''
WARNING:xmodem.XMODEM:recv error: expected SOH, EOT; got ''
INFO:xmodem.XMODEM:error_count reached 16, aborting.
None
Could anybody give me some idea or comments to solve this problem?