瀏覽代碼

[ymodem]添加传输过程中的异常处理流程

wdfk-prog 2 年之前
父節點
當前提交
f54f2c2c91
共有 2 個文件被更改,包括 23 次插入2 次删除
  1. 18 2
      components/utilities/ymodem/ymodem.c
  2. 5 0
      components/utilities/ymodem/ymodem.h

+ 18 - 2
components/utilities/ymodem/ymodem.c

@@ -1,5 +1,5 @@
 /*
- * COPYRIGHT (C) 2011-2021, Real-Thread Information Technology Ltd
+ * COPYRIGHT (C) 2011-2022, Real-Thread Information Technology Ltd
  * All rights reserved
  *
  * SPDX-License-Identifier: Apache-2.0
@@ -362,6 +362,7 @@ static rt_err_t _rym_do_trans(struct rym_ctx *ctx)
     _rym_putchar(ctx, RYM_CODE_ACK);
     _rym_putchar(ctx, RYM_CODE_C);
     ctx->stage = RYM_STAGE_ESTABLISHED;
+    rt_size_t errors;
 
     while (1)
     {
@@ -387,7 +388,22 @@ static rt_err_t _rym_do_trans(struct rym_ctx *ctx)
 
         err = _rym_trans_data(ctx, data_sz, &code);
         if (err != RT_EOK)
-            return err;
+        {
+            errors++;
+            if(errors > RYM_MAX_ERRORS)
+            {
+                return err;/* Abort communication */
+            }
+            else
+            {
+                _rym_putchar(ctx, RYM_CODE_NAK);/* Ask for a packet */
+                continue;
+            }
+        }
+        else
+        {
+            errors = 0;
+        }
         switch (code)
         {
         case RYM_CODE_CAN:

+ 5 - 0
components/utilities/ymodem/ymodem.h

@@ -58,6 +58,11 @@ enum rym_code
 #define RYM_END_SESSION_SEND_CAN_NUM  0x07
 #endif
 
+/* how many retries were made when the error occurred */
+#ifndef RYM_MAX_ERRORS
+#define RYM_MAX_ERRORS    ((rt_size_t)5)
+#endif
+
 enum rym_stage
 {
     RYM_STAGE_NONE = 0,