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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库导出Excel格式的表结构

数据库导出Excel格式的表结构 你是否遇到到导出数据库里面的表结构,包含字段名称、类型、长度、小数、默认值、字段描述之类的需求;当我们去navcat里面找时发现没有,因为navcat没有提供这一功能,他只可以导出表结构的sql&#xff…

Stable Diffusion - Style Editor 和 Easy Prompt Selector 提示词插件配置

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/132122450 Style Editor 插件: cd extensions git clone https://ghproxy.com/https://github.com/chrisgoringe/Styles-Editor报错&…

PHP实现首字母头像

<?php $name"哈哈"; $logoletter_avatar($name);echo <img src".$logo." style" border-radius: 50%;">;function letter_avatar($text) {$total unpack(L, hash(adler32, $text, true))[1];$hue $total % 360;list($r, $g, $b) hs…

docker数据持久化

在Docker中若要想实现容器数据的持久化&#xff08;所谓的数据持久化即数据不随着Container的结束而销毁&#xff09;&#xff0c;需要将数据从宿主机挂载到容器中。目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中。 &#xff08;1&#xff09;Volumes&#xff1a;…

Django架构图

1. Django 简介 基本介绍 Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架 使用 Django&#xff0c;只要很少的代码&#xff0c;Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容&#xff0c;并进一步开发出全功能的 Web 服务 Django 本身…

shell 脚本

一、使用PID过滤该进程的所有信息 #! /bin/bash # Function: 根据用户输入的PID&#xff0c;过滤出该PID所有的信息 read -p "请输入要查询的PID: " P nps -aux| awk $2~/^$P$/{print $11}|wc -l if [ $n -eq 0 ];thenecho "该PID不存在&#xff01;&#xff0…

MacBook Pro 16 M1 Max 升级 macOS Ventura 13.5 兼容测评

今天给大家带来了 MacBook Pro 16 M1 Max 升级 macOS Ventura 13.5 兼容 100 挑战赛 的视频&#xff0c;现在充电头再以文章的形式呈现给大家&#xff0c;让大家更清楚、直白的了解这款笔记本在升级系统后的兼容性如何。 MacBook Pro 16 M1 Max 配置了 140W 的 MagSafe 充电口&…

Leetcode-每日一题【剑指 Offer 05. 替换空格】

题目 请实现一个函数&#xff0c;把字符串 s 中的每个空格替换成"%20"。 示例 1&#xff1a; 输入&#xff1a;s "We are happy."输出&#xff1a;"We%20are%20happy." 限制&#xff1a; 0 < s 的长度 < 10000 解题思路 前置知识 Str…

【签到 前缀异或和】牛客多校2023 6E

题意&#xff1a; 思路&#xff1a; 签到签了半天&#xff0c;思路和正解一模一样&#xff0c;但是经典不会调细节 先不去考虑一个区间分为多段&#xff0c;先去考虑一个区间的区间和是偶数 首先很明显&#xff0c;我们只关注奇偶性&#xff0c;因此可以把所有的ai都%2&…

从价值的角度看,为何 POSE 通证值得长期看好

PoseSwap 是 Nautilus Chain 上的首个 DEX&#xff0c;基于 Nautilus Chain 也让其成为了首个以模块化构建的 Layer3 架构的 DEX。该 DEX 本身能够以 Dapp 层&#xff08;Rollup&#xff09;的形态&#xff0c;与其他应用层并行化运行。基于 Zk-Rollup PoseiSwap 具备隐私特性&…

Nacos适配人大金仓国产数据库

nacos版本2.2.0 人大金仓版本8.6.0 一、相关文件 Nacos官方文档-数据源插件https://nacos.io/zh-cn/docs/v2/plugin/datasource-plugin.html Nacos2.2.0源码https://github.com/alibaba/nacos/archive/refs/tags/2.2.0.zip 人大金仓驱动https://download.csdn.net/download/q…

树的层次遍历

层次遍历简介 广度优先在面试里出现的频率非常高&#xff0c;整体属于简单题。而广度优先遍历又叫做层次遍历&#xff0c;基本过程如下&#xff1a; 层次遍历就是从根节点开始&#xff0c;先访问根节点下面一层全部元素&#xff0c;再访问之后的层次&#xff0c;类似金字塔一样…

nginx部署以及反向代理多域名实现HTTPS访问

nginx部署以及反向代理多域名实现 1.nginx部署 1.1 编写nginx部署文件 docker-compose.yml version: 3 services: nginx:restart: always image: nginx:1.20container_name: nginx-mainports:- 80:80- 443:443volumes: # 基础配置- /opt/nginx_main/nginx-info/nginx.conf:/…

商城-学习整理-基础-商品服务API-品牌管理(六)

目录 一、使用逆向工程生成前后端代码1、新增品牌管理菜单2、使用生成的前端代码 二、优化逆向生成的品牌管理页面1、显示状态开关优化2、品牌上传优化&#xff08;使用阿里云存储&#xff09;1&#xff09;阿里云对象存储-普通上传方式2&#xff09;阿里云对象存储-服务端签名…

Linux系统部署Python语言开发运行环境

目录 Ubuntu自带python Debian安装python 安装 pip 库列表 安装第三方库 使用国内镜像站 实装 tkinter 库 编写运行代码 测试代码1 1. 创建项目 2. 创建源码文件 3. 写入源代码 4. 修改权限 5. 运行代码 测试代码2 本文的使用环境是Windows的Linux 子系统&…

基于fpga_EP4CE6F17C8_秒表计数器

文章目录 前言实验手册一、实验目的二、实验原理1&#xff0e;理论原理2&#xff0e;硬件原理 三、系统架构设计四、模块说明1&#xff0e;模块端口信号列表dig_driver(数码管驱动模块)key(按键消抖模块)top(顶层模块) 2&#xff0e;状态转移图3&#xff0e;时序图五、仿真波形…

Windows 本地安装 Mysql8.0

前言 看了网上许多关于Windows 本地安装mysql的很多教程&#xff0c;基本上大同小异。但是安装软件有时就可能因为一个细节安装失败。我也是综合了很多个教程才安装好的&#xff0c; 所以本教程可能也不是普遍适合的。现我将自己本地安装的步骤总结如下&#xff0c;如有不对的…

高级web前端开发工程师的职责说明(合集)

高级web前端开发工程师的职责说明1 职责&#xff1a; 1、根据需求文档&#xff0c;完成PC端、移动端页面及交互的开发&#xff0c;并保证兼容性和确保产品具有优质的用户体验; 2、熟练使用 HTML 、 CSS 、 JS 、 Ajax 等技术&#xff0c;能解决各种浏览器兼容性问题&#xff…

boost beast http server 测试

boost beast http client boost http server boost beast 是一个非常好用的库&#xff0c;带上boost的协程&#xff0c;好很多东西是比较好用的&#xff0c;以下程序使用四个线程开启协程处理进入http协议处理。协议支持http get 和 http post #include <boost/beast/cor…

关于盐雾试验

盐雾实验一般被称为盐雾试验&#xff0c;是一种主要利用盐雾试验设备所创造的人工模拟盐雾环境条件来考核产品或金属材料耐腐蚀性能的环境试验。 盐雾实验的主要目的是考核产品或金属材料的耐盐雾腐蚀性能&#xff0c;盐雾试验结果也是对产品质量的判定&#xff0c;是正确衡量…