Skip to content

Commit c44886f

Browse files
author
zhen.guo
committed
1. 修复空文件无法下载 2. 修复整k文件无法下载 3. 修复空间不够下载不成功但不报错 4. 修复内存不够导致的下载失败
1 parent 3d4056e commit c44886f

File tree

1 file changed

+17
-15
lines changed

1 file changed

+17
-15
lines changed

ymodem.py

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,14 @@
1414

1515
# -*- coding:utf-8 -*-
1616

17+
1718
import uos
1819
import ql_fs
1920
import utime as time
20-
from machine import UART
2121
import osTimer
22+
from machine import UART
2223
from queue import Queue
23-
24+
import gc
2425

2526
SOH = b'\x01'
2627
STX = b'\x02'
@@ -46,7 +47,6 @@ def __init__(self,
4647
parity=0,
4748
stopbits=1,
4849
flowctl=0):
49-
5050
self._uart = UART(uart, buadrate, databits, parity, stopbits, flowctl)
5151
self._queue = Queue(maxsize=1)
5252
self._timer = osTimer()
@@ -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-
]
120+
] # TODO release mem
121121

122122
def __init__(self, reader, writer, mode='ymodem1k'):
123123
self.reader = reader
@@ -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) # delete transfer failed file
183+
self._delete_failed_file(self._recv_file_name)
184184
return None
185185
else:
186186
cancel = 1
@@ -204,14 +204,16 @@ def recv(self, crc_mode=1, retry=10, timeout=1000, delay=1, callback=None):
204204
if self._remaining_data_length > 0:
205205
valid_length = min(valid_length, self._remaining_data_length)
206206
self._remaining_data_length -= valid_length
207+
gc.collect()
207208
write_packet += data[:valid_length]
208209
income_size += len(data)
209-
if len(write_packet) not in (0, 1024, 2048, 3072, 4096): # 4k byte packet write
210-
try:
211-
stream.write(write_packet)
212-
except Exception as e:
213-
stream.close()
210+
if len(write_packet) not in (0, 1024, 2048, 3072):
211+
stream.write(write_packet)
214212
write_packet = b""
213+
else:
214+
if self._remaining_data_length == 0:
215+
stream.write(write_packet)
216+
write_packet = b""
215217
self.writer(ACK)
216218
time.sleep_ms(5)
217219
sequence = (sequence + 1) % 0x100
@@ -253,6 +255,8 @@ def _in_transfer_mode(self, crc_mode, retry, delay, timeout=1000, cancel=0, erro
253255
return char
254256
elif char == STX:
255257
return char
258+
elif char == EOT:
259+
return char
256260
elif char == CAN:
257261
if cancel:
258262
return None
@@ -261,7 +265,7 @@ def _in_transfer_mode(self, crc_mode, retry, delay, timeout=1000, cancel=0, erro
261265
else:
262266
error_count += 1
263267

264-
def _get_file_header(self, char, crc_mode, timeout=1000, retry=10, packet_size=128): # Ymodem header default packet size
268+
def _get_file_header(self, char, crc_mode, timeout=1000, retry=10, packet_size=128):
265269
error_count = 0
266270
cancel = 0
267271
while True:
@@ -295,12 +299,12 @@ def _get_file_header(self, char, crc_mode, timeout=1000, retry=10, packet_size=1
295299
if not len(data):
296300
self.writer(ACK)
297301
return None
302+
gc.collect()
298303
self._recv_file_name = bytes.decode(data.split(b"\x00")[0], "utf-8")
299304
self._check_path(self._recv_file_name)
300305
try:
301306
stream = open(self._recv_file_name, "wb+")
302307
except IOError:
303-
# stream.close()
304308
return None
305309
data = bytes.decode(data.split(b"\x00")[1], "utf-8")
306310
if self.program_features & USE_LENGTH_FIELD:
@@ -354,9 +358,7 @@ def _verify_complement(self, timeout=1000, sequence=0):
354358
seq2 = self.reader(1, timeout)
355359
if seq2 is not None:
356360
seq2 = 0xff - ord(seq2)
357-
# Packet received in wrong number
358361
if not (seq1 == seq2 == sequence):
359-
# skip this packet
360362
return False
361363
else:
362364
return True
@@ -385,7 +387,7 @@ def _calc_crc(self, data, crc=0):
385387
return crc & 0xffff
386388

387389
def send(self):
388-
pass
390+
pass # TODO
389391

390392

391393
def enter_ymodem(callback=None):

0 commit comments

Comments
 (0)