Browse Source

ymodem of send error (#6535)

* modified ymodem.c to solve ymodem send file error

* modified ry_sy.c to solve send file error of file data

* Update ry_sy.c

Co-authored-by: guo <guozhanxin@rt-thread.com>
Maihuanyi 2 years ago
parent
commit
de1d6dbc0e
2 changed files with 27 additions and 11 deletions
  1. 4 0
      components/utilities/ymodem/ry_sy.c
  2. 23 11
      components/utilities/ymodem/ymodem.c

+ 4 - 0
components/utilities/ymodem/ry_sy.c

@@ -153,6 +153,10 @@ static enum rym_code _rym_send_data(
         ctx->stage = RYM_STAGE_FINISHING;
     }
 
+    if (read_size > 128)
+    {
+        return RYM_CODE_STX;
+    }
     return RYM_CODE_SOH;
 }
 

+ 23 - 11
components/utilities/ymodem/ymodem.c

@@ -149,20 +149,33 @@ static rt_err_t _rym_send_packet(
     rt_uint16_t send_crc;
     rt_uint8_t index_inv = ~index;
     rt_size_t writelen = 0;
+    rt_size_t packetlen = 0;
 
-    send_crc = CRC16(ctx->buf + 3, _RYM_SOH_PKG_SZ - 5);
+    switch(code)
+    {
+    case RYM_CODE_SOH:
+        packetlen = _RYM_SOH_PKG_SZ;
+        break;
+    case RYM_CODE_STX:
+        packetlen = _RYM_STX_PKG_SZ;
+        break;
+    default:
+        return -RT_ERROR;
+    }
+
+    send_crc = CRC16(ctx->buf + 3, packetlen - 5);
     ctx->buf[0] = code;
     ctx->buf[1] = index;
     ctx->buf[2] = index_inv;
-    ctx->buf[131] = (rt_uint8_t)(send_crc >> 8);
-    ctx->buf[132] = (rt_uint8_t)send_crc & 0xff;
+    ctx->buf[packetlen - 2] = (rt_uint8_t)(send_crc >> 8);
+    ctx->buf[packetlen - 1] = (rt_uint8_t)send_crc & 0xff;
 
     do
     {
         writelen += rt_device_write(ctx->dev, 0, ctx->buf + writelen,
-                                    _RYM_SOH_PKG_SZ - writelen);
+                packetlen - writelen);
     }
-    while (writelen < _RYM_SOH_PKG_SZ);
+    while (writelen < packetlen);
 
     return RT_EOK;
 }
@@ -402,21 +415,20 @@ static rt_err_t _rym_do_send_trans(struct rym_ctx *ctx)
     rt_uint32_t index = 1;
     rt_uint8_t getc_ack;
 
-    data_sz = _RYM_SOH_PKG_SZ;
-
+    data_sz = _RYM_STX_PKG_SZ;
     while (1)
     {
-        if (ctx->on_data && ctx->on_data(ctx, ctx->buf + 3, data_sz - 5) != RYM_CODE_SOH)
+        if (!ctx->on_data)
+        {
             return -RYM_ERR_CODE;
-
-        code = RYM_CODE_SOH;
+        }
+        code = ctx->on_data(ctx, ctx->buf + 3, data_sz - 5);
 
         _rym_send_packet(ctx, code, index);
         index++;
         rt_device_set_rx_indicate(ctx->dev, _rym_rx_ind);
 
         getc_ack = _rym_getchar(ctx);
-
         if (getc_ack != RYM_CODE_ACK)
         {
             return -RYM_ERR_ACK;