当前位置:   article > 正文

bootloader使用完善ymodem协议(优化完善stm的ymodem协议),以及xshell终端结束(超详细教程,简单好学,看了秒懂)_xshell ymodem不显示结束

xshell ymodem不显示结束

通过研究stm的ymodem协议,发现EOT之后直接就进行ACK回复确认了,没有进行NAK反复确认

所以具体需要修改:

主要是修改Ymodem_Receive函数

首先EOT 之后 直接默认结束传输,所以将ACK修改为NAK

最后在该函数的最后,模拟再次ACK C确认

然后接收一包结束帧,再回复ACK确认

注意:如果是xshell等终端需要再发送一个结束,提示ymodem协议结束

添加基础的注释,便于理解,目前代码还没整理完成,先暂时不上传了,只是上传官方的标准库

链接:https://pan.baidu.com/s/1Y4jVoSSPUTceuIA-O6X6Fg
提取码:n0kw
--来自百度网盘超级会员V4的分享

  1. /**
  2. * @brief 使用ymodem接受一个文件
  3. * @param buf: 第一个字节的地址.
  4. * @retval 文件的大小.
  5. */
  6. LONG Ymodem_Receive (UCHAR *buf)
  7. {
  8. UCHAR packet_data[PACKET_1K_SIZE + PACKET_OVERHEAD], file_size[FILE_SIZE_LENGTH], *file_ptr, *buf_ptr;
  9. LONG i, packet_length, session_done, file_done, packets_received, errors, session_begin, size = 0;
  10. ULONG flashdestination, ramsource;
  11. ULONG t = 0;
  12. UCHAR c = 0;
  13. /* 初始化flash地址 */
  14. flashdestination = APPLICATION_ADDRESS;
  15. for (session_done = 0, errors = 0, session_begin = 0; ;)
  16. {
  17. for (packets_received = 0, file_done = 0, buf_ptr = buf; ;)
  18. {
  19. switch (Receive_Packet(packet_data, &packet_length, NAK_TIMEOUT))
  20. {
  21. /* 如果接收成功 */
  22. case 0:
  23. {
  24. /* 错误标志清零 */
  25. errors = 0;
  26. switch (packet_length)
  27. {
  28. /* 被发送者终止 */
  29. case - 1:
  30. {
  31. Send_Byte(ACK);
  32. return 0;
  33. }
  34. /* 结束传输 */
  35. case 0:
  36. {
  37. /* 修改该地方 */
  38. Send_Byte(NAK);
  39. file_done = 1;
  40. break;
  41. }
  42. default:
  43. /* 正常包 */
  44. if ((packet_data[PACKET_SEQNO_INDEX] & 0xff) != (packets_received & 0xff))
  45. {
  46. Send_Byte(NAK);
  47. }
  48. else
  49. {
  50. /* 如果是第一个起始帧 */
  51. if (packets_received == 0)
  52. {
  53. /* 文件名字包 */
  54. if (packet_data[PACKET_HEADER] != 0)
  55. {
  56. /* file_ptr+3 因为前三个字节是首部 再就是文件名字 */
  57. for (i = 0, file_ptr = packet_data + PACKET_HEADER; (*file_ptr != 0) && (i < FILE_NAME_LENGTH);)
  58. {
  59. FileName[i++] = *file_ptr++;
  60. }
  61. /* 获取到的文件名字字符串 */
  62. FileName[i++] = '\0';
  63. /* 文件名字之后紧接着就是文件大小 */
  64. for (i = 0, file_ptr ++; (*file_ptr != ' ') && (i < FILE_SIZE_LENGTH);)
  65. {
  66. file_size[i++] = *file_ptr++;
  67. }
  68. file_size[i++] = '\0';
  69. /* 将文件大小转换为字符串 */
  70. Str2Int(file_size, &size);
  71. /* 检测被发送镜像bin文件的大小 */
  72. /* 如果镜像bin文件比flash大 */
  73. if (size > (USER_FLASH_SIZE + 1))
  74. {
  75. /* End session */
  76. Send_Byte(CA);
  77. Send_Byte(CA);
  78. /*debug 文件太大 flash太小 没有合适的空间 */
  79. return -1;
  80. }
  81. /* 擦除flash */
  82. FLASH_If_Erase(APPLICATION_ADDRESS);
  83. Send_Byte(ACK);
  84. /* 收到第起始帧后立马回应 发送c */
  85. Send_Byte(CRC16);
  86. }
  87. /* 文件名字包为空,结束传输 */
  88. else
  89. {
  90. Send_Byte(ACK);
  91. file_done = 1;
  92. session_done = 1;
  93. break;
  94. }
  95. }
  96. /* 数据帧 */
  97. else
  98. {
  99. /* 拷贝当前的数据 */
  100. memcpy(buf_ptr, packet_data + PACKET_HEADER, packet_length);
  101. ramsource = (ULONG)buf;
  102. /* 往flash里边写数据 packet_length/4的原因是一个字占4个字节 */
  103. if (FLASH_If_Write(&flashdestination, (ULONG *) ramsource, (USHORT) packet_length/4) == 0)
  104. {
  105. Send_Byte(ACK);
  106. }
  107. else /* 当往flash写的时候,出现错误 */
  108. {
  109. /* 结束传输 */
  110. Send_Byte(CA);
  111. Send_Byte(CA);
  112. return -2;
  113. }
  114. }
  115. packets_received ++;
  116. session_begin = 1;
  117. }
  118. }
  119. break;
  120. }
  121. case 1:
  122. {
  123. Send_Byte(CA);
  124. Send_Byte(CA);
  125. return -3;
  126. }
  127. default:
  128. {
  129. if (session_begin > 0)
  130. {
  131. errors ++;
  132. }
  133. if (errors > MAX_ERRORS)
  134. {
  135. Send_Byte(CA);
  136. Send_Byte(CA);
  137. return 0;
  138. }
  139. Send_Byte(CRC16);
  140. break;
  141. }
  142. }
  143. if (file_done != 0)
  144. {
  145. break;
  146. }
  147. }
  148. if (session_done != 0)
  149. {
  150. break;
  151. }
  152. }
  153. Send_Byte(ACK);
  154. Send_Byte(CRC16);
  155. /* 最后接收结束帧 该帧其实不管对错 都已经传输完成 */
  156. Receive_Packet(packet_data, &packet_length, NAK_TIMEOUT);
  157. Send_Byte(ACK);
  158. return (LONG)size;
  159. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/779908
推荐阅读
  

闽ICP备14008679号