2424from queue import Queue
2525from machine import UART
2626
27+ name , platform = uos .uname ()[1 ].split ("=" ,1 )
28+ platform = platform .split ("_" ,1 )[0 ]
29+
2730SOH = b"\x01 "
2831STX = b"\x02 "
2932EOT = b"\x04 "
@@ -216,6 +219,7 @@ def recv(self, crc_mode=1, retry=10, timeout=1000, delay=1, callback=None):
216219 if cancel :
217220 self .writer (ACK )
218221 stream .close ()
222+ stream = None
219223 if callable (callback ):
220224 callback (self ._recv_file_name , income_size )
221225 self .recv ()
@@ -241,6 +245,18 @@ def recv(self, crc_mode=1, retry=10, timeout=1000, delay=1, callback=None):
241245 pass
242246 else :
243247 data = self .reader (packet_size + 1 + crc_mode )
248+ if platform == "FCM360W" or platform == "FCM362K" :
249+ retry_times = 10
250+ while len (data ) < (packet_size + 1 + crc_mode ):
251+ lost_data_len = packet_size + 1 + crc_mode - len (data )
252+ buf = self .reader (lost_data_len , timeout )
253+ data += buf
254+ if buf == b'' :
255+ retry_times -= 1
256+ else :
257+ retry_times = 10
258+ if retry_times <= 0 :
259+ break
244260 if data and len (data ) == (packet_size + 1 + crc_mode ):
245261 valid , data = self ._verify_recv_checksum (crc_mode , data )
246262 # Write the original data to the target file
@@ -264,10 +280,13 @@ def recv(self, crc_mode=1, retry=10, timeout=1000, delay=1, callback=None):
264280 time .sleep_ms (5 )
265281 sequence = (sequence + 1 ) % 0x100
266282 char = self .reader (1 , timeout )
283+ del (data )
267284 continue
268285 else :
286+ del (data )
269287 pass
270288 else :
289+ del (data )
271290 pass
272291 while True :
273292 data = self .reader (1 , timeout )
@@ -277,6 +296,8 @@ def recv(self, crc_mode=1, retry=10, timeout=1000, delay=1, callback=None):
277296 char = self .reader (1 , timeout )
278297 continue
279298 except Exception as e :
299+ if stream :
300+ stream .close ()
280301 sys .print_exception (e )
281302 return False
282303
@@ -339,6 +360,21 @@ def _get_file_header(self, char, crc_mode, timeout=1000, retry=10, packet_size=1
339360 pass
340361 else :
341362 data = self .reader (packet_size + 1 + crc_mode )
363+ if platform == "FCM360W" or platform == "FCM362K" :
364+ retry_times = 5
365+ while len (data ) < (packet_size + 1 + crc_mode ):
366+ lost_data_len = packet_size + 1 + crc_mode - len (data )
367+ while self ._uart .any () < lost_data_len :
368+ time .sleep_ms (10 )
369+ retry_times -= 1
370+ if retry_times <= 0 :
371+ break
372+ buf = self .reader (lost_data_len , timeout )
373+ data += buf
374+ if buf == b'' :
375+ break
376+ else :
377+ retry_times = 5
342378 if data and len (data ) == (packet_size + 1 + crc_mode ):
343379 valid , data = self ._verify_recv_checksum (crc_mode , data )
344380 if valid :
@@ -379,6 +415,9 @@ def _get_file_header(self, char, crc_mode, timeout=1000, retry=10, packet_size=1
379415 data = self .reader (1 , timeout )
380416 if data is None :
381417 break
418+ if platform == "FCM360W" or platform == "FCM362K" :
419+ if data == b'' :
420+ return None
382421 self .writer (NAK )
383422 char = self .reader (1 , timeout )
384423 continue
@@ -436,6 +475,8 @@ def send(self, trans_file, retry=10, timeout=1000, callback=None):
436475 # Not all but most programs support 1k length
437476 ymodem1k = (128 , 1024 )[(self .program_features & ALLOW_1K_BLOCK ) != 0 ],
438477 )[self .mode ]
478+ if "BG95" in platform :
479+ packet_size = 128
439480 self .total_size = sum ([i ["length" ] for i in trans_file ])
440481 success_count = 0
441482 for i in trans_file :
@@ -588,7 +629,7 @@ def serial_trans(self, info, timeout=1000, retry=10, success_count=1, sequence=N
588629 _print ("[Sender]: reader resp char {}" .format (char ))
589630 if char == ACK :
590631 return True
591- elif char == NAK : # 接收端写文件异常直接中断
632+ elif char == NAK : # 鎺ユ敹绔啓鏂囦欢寮傚父鐩存帴涓柇
592633 return False
593634 else :
594635 _print ("[Sender]: error, expected ACK but got {} for block {}" .format (char , str (sequence )))
@@ -634,14 +675,20 @@ def _send_end_packet(self, packet_size, crc_mode=1):
634675
635676
636677def enter_ymodem (callback = None ):
637- serial_io = Serial (UART .REPL_UART if hasattr (UART , "REPL_UART" ) else UART .UART3 )
678+ if platform == "FCM360W" or platform == "FCM362K" :
679+ serial_io = Serial (UART .REPL_UART , buadrate = 115200 )
680+ else :
681+ serial_io = Serial (UART .REPL_UART if hasattr (UART , "REPL_UART" ) else UART .UART3 )
638682 receiver = Modem (serial_io .read , serial_io .write )
639683 receiver .recv (callback = callback )
640684 serial_io .close ()
641685
642686
643687def send_file (trans_file ):
644- serial_io = Serial (UART .REPL_UART if hasattr (UART , "REPL_UART" ) else UART .UART3 )
688+ if platform == "FCM360W" or platform == "FCM362K" :
689+ serial_io = Serial (UART .REPL_UART , buadrate = 115200 )
690+ else :
691+ serial_io = Serial (UART .REPL_UART if hasattr (UART , "REPL_UART" ) else UART .UART3 )
645692 sender = Modem (serial_io .read , serial_io .write )
646693 try :
647694 sender .send (trans_file )
@@ -651,4 +698,4 @@ def send_file(trans_file):
651698
652699
653700if __name__ == "__main__" :
654- enter_ymodem ()
701+ enter_ymodem ()
0 commit comments