当前位置:   article > 正文

[RT-Thread]基于ART-PI的YMODEM协议在文件系统(LFS,FAT,RAMFS)下的文件传输及其注意事项_rtthread ry

rtthread ry

[写作为了记忆,个人最终输出的内容往往是遗忘后最容易捡起的内容,朝花夕拾故以此作文]

目录

[写作为了记忆,个人最终输出的内容往往是遗忘后最容易捡起的内容,朝花夕拾故以此作文]

前提

准备工作

内容

问题也就是注意事项


前提

准备工作

  1. 创建基于ART-PI开发板(STM32H750)的工程,在RT-Thread Studio中创建工程。
  2. 搭建文件系统,无论是ROMFS,RAMFS,LFS,FAT都行,不同的文件系统依赖的存储介质不同,比如RAMFS依靠RAM,速度肯定更快,而FAT依赖SD Card 或FLASH,速度相对就慢一些。各个文件系统能够存储文件的大小也各不相同,RAMFS受限于RAM的大小,而FAT受限于FLASH或SD CARD的大小,一般情况下用FAT用的多,因为空间够大.
  3. 使能YMODEM协议.通过YMODEM协议可以直接把文件下载到文件系统里(ARTPI接受)。也可以把文件系统里的哪些文件保存到本地电脑上(ARTPI发送)
  4. 安装xshell工具.

内容

在准备工作就绪后,

tab可以显示出ry sy的命令 

 ls 命令可以看到flash目录下的文件(图中的文件是我自己上传的)

 在这里,基于不同的YMODEM的版本,通过源码得知有一个版本是只能下载到根目录下,这个时候要么换最新的YMODEM版本,要么把文件系统挂载到根目录下.另外YMODEM的第一个版本(对应的RT Thread 的库版本是4.1.0)对文件重传处理不是特别好.

命令

ry/sy [文件路径]  [传输的设备名]

 ry是下载文件进板子,sy是传教文件到本地电脑.

 默认会通过控制台输出设备进行传输,而控制台输出设备通常是串口设备.

比如下载文件到/flash目录下,使用串口1去传输命令为:

ry /flash  uart1

 正常的情况下,应该不需要瞎折腾就能实现文件互传.但在使用控制台使用ry命令下载文件的时候会有一些问题.sy命令下载文件到本地我使用一切良好.下面就是ry指令的一些问题以及解决方法和思路.

问题也就是注意事项

以下都是在默认使用控制台串口时会遇到的:(多开其他的串口来传输文件肯定就没有这个问题)

控制台串口和日志抢占设备的问题?通常也会卡死在这?

首先ymodem协议传输与日志抢占同一个串口设备,日志间接的会去调用rt_kprintf,这里会出现问题,应该在ymodem传输协议时关闭所有日志,或者让控制台的输出设备指向RT_NULL(这样在打印的时候才会什么都不做)

  •  关闭使能内核调试
  • 关闭所有日志

这很困难,因为RT-Thread不只是有ulog这一个日志,通过实践,哪怕没有开启ulog,依然可以使用LOG_X去打印输出,而RT-Thread庞大的软件包和组件,总不可能一个个去注释.说到这里,当使用FAT文件系统去读写文件时,会自动去访问RTC设备读取时间,若是没有RTC设备,打印 not find a RTC  ,若不注释,在使用ry 命令时若输出则直接卡死.还是推荐关闭控制台输出设备.

  • 关闭控制台输出设备,让日志输出无效.
  1. /*enable or disable console uart device*/
  2. void DisableConsole(rt_uint8_t flag)
  3. {
  4. static rt_device_t old_device;
  5. if(flag == 1){
  6. if(_console_device != RT_NULL)
  7. {
  8. old_device = _console_device;
  9. }
  10. _console_device = RT_NULL;
  11. }
  12. else
  13. {
  14. _console_device = old_device; //recover
  15. }
  16. }
  17. RTM_EXPORT(DisableConsole);

在组件文件\rt-thread\components\utilities\ymodem\ry_sy.c 的ry函数,在使用控制台的串口设备下载文件前打开,下载后关闭。

  •  在FAT文件系统下,若在使用YMODEM协议下载文件时报 not find a RTC,导致卡死,这是因为FAT文件系统在读写操作时会去访问RTC设备读取时间,若没有开启RTC设备则报这个错误,这也是因为rtt在log日志打印上没有一个统一的开关,ulog哪怕关闭使能,LOG_X的函数也能用,这里找到打印这句话的代码注释就行.

传输速度太慢的问题?

这里明确给出在9600波特率下,1k为一个分组下,速度大概是1k/s左右,而在115200下,速度通常能达到6-10k/s的速度.所以高的波特率肯定比低的波特率要快.

xshell下设置分组大小为1K ,相当于提升了一个包的数据大小

使用工具分析YMODEM的数据.

使用Bus Hound 对串口数据进行抓包,判断是否是因为出错把时间花在重传上了.握手倒是没什么需要关注的,重点关心重传:

比如一次PC发送完数据包后回应06 则接收端(ARTPI)正确接受,回应为15则丢包(没有回应)

​​​​​​​

 

参考YMODEM协议格式

YModem协议简介_阿卡基YUAN的博客-CSDN博客

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号