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

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

目录

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

前提

准备工作

内容

问题也就是注意事项


前提

准备工作

  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 命令时若输出则直接卡死.还是推荐关闭控制台输出设备.

  • 关闭控制台输出设备,让日志输出无效.
/*enable or disable console uart device*/
void DisableConsole(rt_uint8_t flag)
{

  static  rt_device_t old_device;

  if(flag == 1){

      if(_console_device != RT_NULL)
      {
          old_device = _console_device;
      }

      _console_device = RT_NULL;
  }
  else
  {
      _console_device = old_device;  //recover
  }

}
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博客

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值