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

news2024/9/23 3:23:48

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

目录

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

前提

准备工作

内容

问题也就是注意事项


前提

准备工作

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/839820.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kernel Exception导致手机重启案例分析

和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、高温触发 Kernel Exception 重启问题二、解决方案三、提高电池温度方案 一、 高温触发 Kernel Exception 重启问题 手机 电池温度 默认60度以上高温…

网页版Java(Spring/Spring Boot/Spring MVC)五子棋项目(二)前后端实现用户的登录和注册功能【用户模块】

网页版Java五子棋项目(二)前后端实现用户的登录和注册功能【用户模块】 在用户模块我们要清楚要完成的任务一、MyBatis后端操作数据库1. 需要在数据库创建用户数据库1. 用户id2. 用户名3. 密码4. 天梯积分5. 总场数6. 获胜场数 2. 创建用户类User和数据库…

网络开发-IO模型

基本概念 I/O即数据的读取&#xff08;接收&#xff09;或写入&#xff08;发送&#xff09;操作 通常用户进程中的一个完整I/O分为两个阶段 用户进程空间<-->内核空间内核空间<-->设备空间&#xff08;磁盘、网卡等&#xff09; I/O分为内存I/O、网络I/O和磁盘…

python机器学习(六)决策树(上) 构造树、信息熵的分类和度量、信息增益、CART算法、剪枝

决策树算法 模拟相亲的过程&#xff0c;通过相亲决策图&#xff0c;男的去相亲&#xff0c;会先选择性别为女的&#xff0c;然后依次根据年龄、长相、收入、职业等信息对相亲的另一方有所了解。 通过决策图可以发现&#xff0c;生活中面临各种各样的选择&#xff0c;基于我们的…

考研408 | 【计算机网络】物理层

导图&#xff1a; 一、通信基础 基本概念&#xff1a; 物理层接口特性&#xff1a;物理层解决如何在连接各种计算机的传输媒体上传输数据比特流&#xff0c;而不是指具体的传输媒体。 物理层主要任务&#xff1a;确定与传输媒体接口有关的一些特性 典型的数据通信模型 数据通…

SAP-MM-发票校验的重复校验功能

路径&#xff1a;SPRO-物料管理-后勤发票校验-收入发票-设置重复发票检查 按公司代码设置重复检查&#xff0c;可以按三个方式进行检查&#xff0c;公司代码、参照、发票日期&#xff0c;如果此处未维护就是按供应商&#xff08;XK02&#xff09;的六项进行检查 但是如果两处都…

latex插入不连续的中线

在上面的示例中&#xff0c;\cmidrule(lr){1-3} 表示在第 1 列到第 3 列之间添加不连续的中线&#xff0c;\cmidrule(lr){4-6} 表示在第 4 列到第 6 列之间添加不连续的中线&#xff0c;以此类推。你可以根据需要调整列的范围和对齐方式。

合并两个有序链表(leetcode)

题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]思路 每次递归都会比较当前两个节点的值&#xff0c;选择较小的节点作为合并后的链…

Java8 文件工具类 FileUtils(持续更新中)

1. Java8 文件处理 使用 Java8 的 java.nio.file 方法&#xff0c;来进行文件处理。 1.1. 读文件 所有内容一次读出来&#xff0c;结果为字符串。 1.1.1. 代码 /*** 读取文件** param path 文件路径* return 文件内容&#xff08;字符串&#xff09;*/public static String…

Python导出SqlServerl数据字典为excel

sql代码 SELECTtableName D.name ,tableIntroduce isnull(F.value, ),sort A.colorder,fieldName A.name,catogary B.name,bytes A.Length,lengths COLUMNPROPERTY(A.id, A.name, PRECISION),scales isnull(COLUMNPROPERTY(A.id, A.name, Scale), 0),isOrNotNull Cas…

差值结构的相互作用能

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点&#xff0c;AB训练集各由6张二值化的图片组成&#xff0c;让A&#xff0c;B中各有3个点&#xff0c;且不重合&#xff0c;统计迭代次数并排序。 其中有10组数据 差值结构 A-B 迭代次数 构造平均列 平均列…

2.4G芯片G350开发的遥控玩具解决方案

玩具从早期的简单功能&#xff0c;到现如今各种各样的智能操作&#xff0c;发展的速度也是飞速的。随着玩具市场的逐步完善与推进&#xff0c;中国的智能玩具市场也出现了很多远程遥控玩具。遥控玩具也是从最初的有线到现在的无线&#xff0c;从地上跑的到天上飞的&#xff0c;…

vue2-常用的修饰符有哪些应用场景?

1、修饰符是什么&#xff1f; 在程序的世界里&#xff0c;修饰符是用于限定类型以及类型成员的声明的一种 符号。 在vue中&#xff0c;修饰符处理了许多DOM事件的细节&#xff0c;让我们不再需要花大量的时间去处理这些重复的事情&#xff0c;而能有更多的精力专注于程序的逻辑…

安全作业-Race竞争型漏洞、原型链污染

1.race漏洞一直卡在虚拟机安装上(待研究) 2.原型链污染 一、第一题js代码 const express require(express) var hbs require(hbs); var bodyParser require(body-parser); const md5 require(md5); var morganBody require(morgan-body); const app express(); var use…

入侵检测-IDS

1. 什么是IDS&#xff1f; IDS&#xff08;intrusion detection system&#xff09;入侵检测系统&#xff0c;是一种对网络传输进行即时监视&#xff0c;在发现可疑传输时发出警报或者采取主动反应措施的网络安全设备。它会对系统的运行状态进行监视&#xff0c;发现各种攻击企…

外边距实现居中的写法

1、代码实例 2、默认是贴到左侧对齐的&#xff0c;但我们想要把他贴到中间对齐 3、居中的写法 4、这样就可以保证盒子居中了 5、以上写法仅适于行内元素和行内块元素的写法&#xff0c;有没有什么方法适用于行内块元素&#xff1a;可以添加text-align:center进行添加&#xff0…

stl_list类(使用+实现)(C++)

list 一、list-简单介绍二、list的常用接口1.常见构造2.iterator的使用3.Capacity和Element access4.Modifiers5.list的迭代器失效 三、list实现四、vector 和 list 对比五、迭代器1.迭代器的实现2.迭代器的分类&#xff08;按照功能分类&#xff09;3.反向迭代器(1)、包装逻辑…

Julia 日期和时间

Julia 通过 Dates 模块提供了以下三个函数来处理日期和时间&#xff1a; Date&#xff1a;表示日期&#xff0c;精确到日&#xff0c;只显示日期。DateTime&#xff1a;表示日期和时间&#xff0c;精确到毫秒。DateTime&#xff1a;表示日时间&#xff0c;精确到纳秒&#xff…

Unity 3D ScrollRect和ScrollView回弹问题的解决

你是否是这样&#xff1f; Content高度 < 全部Cell加在一起的总高 他就认为你的全部Cell加起来就跟Content一样大&#xff0c;所以才出现了这种完全回弹 我该怎么办&#xff1f; 很简单&#xff0c;改变Content的长度跟所有Cell的和一样大 void RefreshSize(){float allD…