1414
1515# -*- coding:utf-8 -*-
1616
17-
1817import uos
1918import ql_fs
2019import utime as time
21- import osTimer
2220from machine import UART
21+ import osTimer
2322from queue import Queue
2423
24+
2525SOH = b'\x01 '
2626STX = b'\x02 '
2727EOT = b'\x04 '
4141class Serial (object ):
4242 def __init__ (self ,
4343 uart ,
44- buadrate = 115200 ,
44+ buadrate = 57600 ,
4545 databits = 8 ,
4646 parity = 0 ,
4747 stopbits = 1 ,
@@ -117,7 +117,7 @@ class Modem(object):
117117 0x7c26 , 0x6c07 , 0x5c64 , 0x4c45 , 0x3ca2 , 0x2c83 , 0x1ce0 , 0x0cc1 ,
118118 0xef1f , 0xff3e , 0xcf5d , 0xdf7c , 0xaf9b , 0xbfba , 0x8fd9 , 0x9ff8 ,
119119 0x6e17 , 0x7e36 , 0x4e55 , 0x5e74 , 0x2e93 , 0x3eb2 , 0x0ed1 , 0x1ef0 ,
120- ] # TODO release mem
120+ ]
121121
122122 def __init__ (self , reader , writer , mode = 'ymodem1k' ):
123123 self .reader = reader
@@ -142,7 +142,7 @@ def recv(self, crc_mode=1, retry=10, timeout=1000, delay=1, callback=None):
142142 """
143143 try :
144144 stream = None
145- char = self ._in_transfer_mode (crc_mode , 100 , delay )
145+ char = self ._in_transfer_mode (crc_mode , retry , delay )
146146 if char is not None :
147147 stream = self ._get_file_header (char , crc_mode )
148148 if stream is not None :
@@ -180,7 +180,7 @@ def recv(self, crc_mode=1, retry=10, timeout=1000, delay=1, callback=None):
180180 char = self .reader (1 , timeout )
181181 elif char == CAN :
182182 if cancel :
183- self ._delete_failed_file (self ._recv_file_name )
183+ self ._delete_failed_file (self ._recv_file_name ) # delete transfer failed file
184184 return None
185185 else :
186186 cancel = 1
@@ -206,13 +206,14 @@ def recv(self, crc_mode=1, retry=10, timeout=1000, delay=1, callback=None):
206206 self ._remaining_data_length -= valid_length
207207 write_packet += data [:valid_length ]
208208 income_size += len (data )
209- if len (write_packet ) not in (0 , 1024 , 2048 , 3072 , 4096 ):
209+ if len (write_packet ) not in (0 , 1024 , 2048 , 3072 , 4096 ): # 4k byte packet write
210210 try :
211211 stream .write (write_packet )
212- except IOError as e :
212+ except Exception as e :
213213 stream .close ()
214214 write_packet = b""
215215 self .writer (ACK )
216+ time .sleep_ms (5 )
216217 sequence = (sequence + 1 ) % 0x100
217218 char = self .reader (1 , timeout )
218219 continue
@@ -260,7 +261,7 @@ def _in_transfer_mode(self, crc_mode, retry, delay, timeout=1000, cancel=0, erro
260261 else :
261262 error_count += 1
262263
263- def _get_file_header (self , char , crc_mode , timeout = 1000 , retry = 10 , packet_size = 128 ):
264+ def _get_file_header (self , char , crc_mode , timeout = 1000 , retry = 10 , packet_size = 128 ): # Ymodem header default packet size
264265 error_count = 0
265266 cancel = 0
266267 while True :
@@ -299,6 +300,7 @@ def _get_file_header(self, char, crc_mode, timeout=1000, retry=10, packet_size=1
299300 try :
300301 stream = open (self ._recv_file_name , "wb+" )
301302 except IOError :
303+ # stream.close()
302304 return None
303305 data = bytes .decode (data .split (b"\x00 " )[1 ], "utf-8" )
304306 if self .program_features & USE_LENGTH_FIELD :
@@ -352,7 +354,9 @@ def _verify_complement(self, timeout=1000, sequence=0):
352354 seq2 = self .reader (1 , timeout )
353355 if seq2 is not None :
354356 seq2 = 0xff - ord (seq2 )
357+ # Packet received in wrong number
355358 if not (seq1 == seq2 == sequence ):
359+ # skip this packet
356360 return False
357361 else :
358362 return True
@@ -381,14 +385,14 @@ def _calc_crc(self, data, crc=0):
381385 return crc & 0xffff
382386
383387 def send (self ):
384- pass # TODO
388+ pass
385389
386390
387391def enter_ymodem (callback = None ):
388- serial_io = Serial (UART .UART3 ) #TODO
392+ serial_io = Serial (UART .REPL_UART )
389393 receiver = Modem (serial_io .read , serial_io .write )
390394 receiver .recv (callback = callback )
391- serial_io .close () #TODO
395+ serial_io .close ()
392396
393397
394398if __name__ == '__main__' :
0 commit comments