远程升级单片机程序怎么设计?

2023-10-31

    

    之前的文章中介绍过串口和U盘的IAP程序设计。在物联网应用中,远程IAP升级MCU的程序是一项非常有用的功能。当设备出现程序问题或者需要更新程序时,只需要在服务器上对设备进行升级,不需要在有专门的人员去现场进行升级,节省人力物力。

    要实现远程升级,首先要实现以下几个基本功能:

    1、Flash读写。不管是本地IAP还是远程IAP,这都是最基本的功能。

    2、无线通讯。可通过WIFI、4G、以太网等多种方式来实现,根据实际项目需求选择。

    3、通讯协议。常用的通讯协议有TCP、HTTP、FTP、MQTT等。其中HTTP、FTP和MQTT都属于应用层协议,都是基于TCP(传输层)来实现的。用户也可以自己基于TCP编写简单的通讯协议来实现。

    远程IAP与本地IAP的设计思路是一致的,都需要设计BOOT程序和APP程序。但也有一些需要注意的地方。主要是远程升级需要考虑网络延迟甚至网络中断的问题。体现在以下几方面:

 

设计程序缓存区

    在内部或外部存储器开辟一块区域,用于存储分包接收到的程序数据。等到全部数据接收完毕后再一次性写入到Flash进行升级。这样做有以下2点好处:

    1.直接升级时间可能会比较长,影响用户正常使用,增加缓存区设计可以大大减少升级时间。

    2.直接升级时,如果网络出现问题,可能导致设备无法正常启动变砖。增加缓存区设计后,即使升级数据传输失败,也不影响设备的正常使用。

健壮的通讯协议

    本地升级时数据传输出错的概率比较小。但远程设计时就需要多考虑一些,比如前后两包数据可能同时达到等。因此,设计通讯协议时,就要更严谨,服务器发送的指令和数据都需要设备的确认回复。

程序备份设计

    即使有上面的各种设计的保障,也不能保证升级过程不会失败。最好能够设计一个程序备份区,在程序升级失败时运行备份区程序。

 

下面介绍一种简单的远程升级的步骤。

  1. 服务器发送升级请求指令。

  2. 设备回复收到请求升级指令。

  3. 服务器发送程序升级数据。(一般包含包头、包号、总包数、分包的程序数据、校验)

  4. 设备收到程序数据后,确认校验无误,存储到程序缓存区,并按包号回复服务器,防止出现传输包错乱。

  5. 服务器收到回复后再发送下一包数据,直至结束。

  6. 程序数据发送完成后,服务器发送升级结束指令。

  7. 设备收到结束指令后,回复服务器。并在Flash指定位置写入升级标志,重启进入BOOT程序。

  8. BOOT程序读取升级标志,若需要升级,则读取程序缓存区数据,写入到Flash中。

  9. 升级完毕,跳转到Flash指定地址运行。

 

推荐阅读:

STM32固件IAP程序实现

STM32F4通过U盘升级程序

STM32CubeMX之内部Flash读写

欢迎关注公众号"嵌入式技术开发",大家可以后台给我留言沟通交流。如果觉得该公众号对你有所帮助,也欢迎推荐分享给其他人。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

远程升级单片机程序怎么设计? 的相关文章

  • 在 Java 中将系统属性设置为 Null

    在我的单元测试中 我需要将 workingDir 系统属性设置为 Null 但我不能这样做 因为它给了我 NullPointerException System setProperty workingDir null 我该怎么做 您不能将属
  • Maven 配置文件相当于 Gradle

    我试图在我的 spring boot 项目构建中实现一个简单的场景 包括 排除依赖项以及根据环境打包 war 或 jar 例如 对于环境dev包括开发工具和包 jar 用于prod包战等 我知道它不再是基于 XML 的配置 我基本上可以在
  • Java:BufferedReader readLine() 中的 IOEXception 有何用途?

    我可以使用 try catch 循环 修复 以下异常 但我无法理解原因 为什么 in readLine 部分会不断引发IOExceptions 抛出此类异常的真正目的是什么 目标可能不仅仅是更多副作用 代码和 IOException jav
  • Spring Batch 多线程

    我正在编写一个 Spring Batch 并希望在需要时对其进行扩展 我的 ApplicationContext 看起来像这样 Configuration EnableBatchProcessing EnableTransactionMan
  • 通过 JDBC 调用 Sybase 存储过程时结果集为空

    我正在调用一个通过 JDBC 返回多个结果集的 Sybase 存储过程 我需要获取一个特定的结果集 其中有一列名为 结果 这是我的代码 CallableStatement cs conn prepareCall sqlCall cs reg
  • 将对象列表传递给 Freemarker 然后循环

    我已经熟悉了 FreeMarker 一个 Java 模板引擎 我已经能够通过哈希映射将对象传递给模板引擎了 这样就可以了 但是 一旦我尝试将任何类型的多个对象集传递给 FreeMarker 它就会给我一个 freemarker templa
  • SwingWorker 在 Unsafe.park() 处挂起

    我有一个SwingWorker与后台服务器通信 然后更新JFrame 我正在调试我的应用程序并注意到即使在SwingWorker完成了它的工作 它的线程仍然存在 它挂在Unsafe park java lang Object 这是一个本机方
  • 如何在 Linux 中显示进程状态(阻塞、非阻塞)

    有没有办法查询 Linux 进程表中进程的状态 以便能够演示执行查询时进程是正在运行还是被阻止 我的目标是从进程或程序的 外部 执行此操作 因为我希望从操作系统进程的角度来理解这一点 但欢迎任何想法 这是Python代码阻塞的过程 impo
  • Apache POI 的 ProGuard 设置

    我正在构建一个使用 Apache POI 库的应用程序 当我调试应用程序 在不运行 Proguard 的情况下编译它 时 一切都运行良好 但是在导出 APK 后 当我运行应用程序并打开 Excel 文件时 出现以下异常 RuntimeExc
  • Maven:如何获取捆绑在包中的 .so 库

    我有一个带有 jar 和 so 文件的第三方库 我配置了 pom xml 如下
  • 用 Java 捕获扬声器输出

    使用Java可以捕获扬声器输出吗 此输出不是由我的程序生成的 而是由其他正在运行的应用程序生成的 这可以用 Java 完成还是我需要求助于 C C 我有一个基于 Java 的应用程序 使用过的爪哇声音 https stackoverflow
  • 如何更改tomcat jmx密码的文件权限

    我正在尝试保护 Windows 平台上托管的本地 tomcat 实例上的 JMX 访问 我已经创建了访问权限和密码文件 并使用以下 VM 参数插入这些文件 Dcom sun management jmxremote password fil
  • 在java中将jpeg/png转换为像素数组

    如何将包含 jpeg 或 png 的字符串转换为像素数组 最好是一维 理想情况下使用java内置的类 原来你需要公共文件上传 http commons apache org fileupload 看着那 这用户指南 http commons
  • 在 jFrame 中启用右键单击

    嘿 我正在寻找如何使用 NetBeans 在 jFrame 中启用 仅且仅 右键单击并显示弹出菜单 使用我的代码 private void formMouseClicked java awt event MouseEvent evt pop
  • 获取运行时生成的类的字节

    我正在使用一个 Java 框架 该框架使用自定义类加载器在运行时生成一些 代理 类 我想为任何这样的类获取自定义 ClassLoader 从 loadClass 返回的与该类对应的原始字节数组 这可能吗 我知道 如果一个类作为资源存在 那么
  • Spring Data elasticsearch @Query 注解嵌套对象

    我有两节课 Document public class PracticeQuestion private int userId private List
  • 我可以从同一个 jar 文件执行两个不同的类吗?

    我有一个项目 在一个包中我制作了服务器 在第二个包中我制作了客户端 它运行良好 我想创建一个 Jar 文件 是否可以使用同一个 jar 文件分别运行客户端和服务器 我使用了只有一个 main 的 jar 文件 当我运行 jar 文件时 它会
  • 警告:无法加载 sqljdbc_auth.dll 原因:java.library.path 中没有 sqljdbc_auth

    我正在使用 Ubuntu 12 05 并尝试连接到 Windows Server 2012 来获取数据库 我的数据库名称是 jobs 电脑的IP地址是192 160 1 33 托管在1433 但是当我尝试连接时出现以下错误 WARNING
  • Linux shell 标题大小写

    我正在编写一个 shell 脚本并有一个如下所示的变量 something that is hyphenated 我需要在脚本中的各个点使用它 如下所示 something that is hyphenated somethingthati
  • 如何使用 JRE 部署 JavaFX 11 桌面应用程序

    我有一个 JavaFX JDK 8 桌面业务应用程序 它使用 Java Web Start 进行部署 用户安装了 Java 8 只需访问 URL 我的 AWS Linux 服务器上的公共 URL 即可下载 启动应用程序 使用 Web Sta

随机推荐

  • 心电图心电轴怎么计算_需要你拿小本本记下的知识点——教你怎么看懂心电图...

    心电图 相信大家都很熟悉 但是你是否能看懂心电图呢 攻略来啦 大家可以拿小本本记下来 推荐有点医学基础的人观看 了解一下心电图怎么看 也能对自己有所帮助 接下来就让我们开始吧 心电图的波形组成 见下图 基本知识 1 拿到一个心电图 先看基本
  • python 环境配置测试,手工照敲线性回归实战

    lesson013 linear regression py import numpy as np error for y wx b def compute error for line given points b w points to
  • nodejs --buffer模块(三) buffer的操作和属性

    全局方法 Buffer byteLength string encoding 返回字符串实际字节的长度 Buffer compare buf1 buf2 比较两个buffer的前后顺序 等价于buffer1 compare buf2 Buf
  • 【Qt教程】2.2 - Qt5 布局管理器(水平、垂直、栅格布局)、弹簧、设计一个登陆界面

    使用布局管理器 来设计一个登陆界面 都是操作 没代码没理论 参照 Qt设计一登陆窗口布局 1 新建空工程 双击 ui文件 进入界面设计区 我们新建工程时候 使用的是QMainWindow类 会自动包含菜单栏 状态栏 在右上角对象浏览器中 我
  • TeleGram都有哪些限制?

    账户 用户名 形如 TGgeek 5 32字符 用户名 username 有什么用 一定要设置吗 如何设置 名字长度 1 64字符 姓氏长度 0 64字符 账号自毁时限 如果账号在一定时间内不上线 到时限后会自动删除账号和所有资料 删除后不
  • visual studio:未能加载文件或程序集“xxx.dll”或它的某一个依赖项

    1 没有添加库目录或附加库目录 2 如果dll内部有错误 也会提示这个
  • 内联元素的padding和margin

    内联元素的padding和margin能设置上吗 这是我前段时间面试某中厂被问到的一道面试题 一开始有点懵 但照自己的理解是这样回答的 内联元素不能通过改变宽高来改变元素大小 只能通过内部撑开 padding设置不上 margin left
  • rand()查询效率问题解决

    随机从数据表中取一条数据 我们一般会用到rand 函数 但是如果用不好的话 rand 的效率实在太低 基础使用 SELECT FROM tablename ORDER BY RAND LIMIT 1 这是最基本的rand 用法 实例测试 我
  • 史上最全,Spring Boot入门篇总结,收藏起来慢慢看

    Spring Boot是Spring家族下的一个全新开发框架 其设计目的主要是用来简化Spring应用的创建及开发过程 它提供了自动配置 starter依赖等特性 从而使开发人员从大量的XML配置中解脱出来 Spring Boot致力于在蓬
  • mysql-批量更新

    方法一 用update结合case then实现 原始SQL语句 UPDATE baginfo 2021 09 SET channel id CASE id WHEN 1 THEN 3 WHEN 2 THEN 4 WHEN 3 THEN 5
  • 五分钟9步搞定nginx正向代理配置方法

    nginx在绝大数的场景中我们使用其用于做web中间件或反向代理使用 但是nginx实际上也提供了正向代理的功能 下面我们来进行nginx正向代理配置操作 以便大家能够掌握nginx正向代理配置方法 第一步 获取nginx正向代理模块 gi
  • 微信小程序---点餐小程序左侧滑动菜单实现

    文章目录 前言 一 初识scroll view 二 左侧导航 三 右侧滑动 前言 最近在帮亲戚做一款微信的点餐小程序 以前从没有接触过小程序的我只能现做现卖 一边看文档一边实践尝试 在进行到点菜模块左侧滑动菜单时遇到了小小的阻碍 索性在查找
  • ARM Mbed数字信号处理

    信号处理对于许多应用而言很重要 借助现代计算机的强大功能 许多信号处理功能现在都可以通过数字方式完成 本文 我们将说明如何使用Arm Mbed DSP库进行数字信号处理和控制 低通滤波器 在Arm Mbed 网站上 有关于如何设计和实现低通
  • 基于 LowCodeEngine 的低代码组件体系的建设和实践

    今天在这里和大家聊一聊前端组件 或者现在更流行的说法 物料 的话题 物料本身已经不是一个新鲜的话题了 从 06 年 jQuery 发布 前端物料就开始以各种 jQuery 插件的形式不断涌现 直到今天我们仍然可以在 github 上看到很多
  • spring IOC

    1 主要内容 2 Spring 框架 2 1 Spring 框架概念 Spring 是众多开源java项目中的一员 基于分层的javaEE应用一站式轻量级开源框架 主要核心是 IOC 控制反转 依赖注入 与 AOP 面向切面 两大技术 实现
  • BASE64加密解密问题

    BASE64加密解密问题 问题点 base64解密用base64加密的字符串 没有拿到正确的原字符串 1 原支付链接 https yimafu yeepay com ymf pay qrPay index qr 4AZZPEEO id YM
  • 计算机按键模块,计算器键盘-TM1650/AIP650

    使用TM1650 AIP650作为输入检测芯片 TM1650和AIP650在引脚和功能上完全相同 两个芯片都是可以控制4个8段数码管或者扫描4 7矩阵按键 在读取数据的协议上 两种芯片的读取时序略有不同 但在控制命令上 是大致相同的 制作这
  • JAVA JRE JDK

    JRE Java Runtime Environment JVM 核心库 运行JAVA程序 class文件 所必须的组件 如想开发编译Java程序 java文件 需安装JDK Java Development Kit 安装JDK时默认包含公
  • 3.23 vi/vim:纯文本编辑器

    vi vim 是Linux命令行界面下的文字编辑器 几乎所有的Linux系统都安装了vi 只要学会了vi这个编辑工具 就可以在任何Linux系统上使用它 而vim是vi命令的增强版 Vi IMproved 与vi编辑器完全兼容 此外还有很多
  • 远程升级单片机程序怎么设计?

    之前的文章中介绍过串口和U盘的IAP程序设计 在物联网应用中 远程IAP升级MCU的程序是一项非常有用的功能 当设备出现程序问题或者需要更新程序时 只需要在服务器上对设备进行升级 不需要在有专门的人员去现场进行升级 节省人力物力 要实现远程