接上一篇博文,使用了在线升级的STM32程序的方法。此篇博文将利用4G模块Air720H,使用AT指令集,通过HTTP协议从云端服务器下载新版固件,从而实现对STM32的远程无线程序升级。

前面关于前期准备工作,在此不再累述 具体可以参考上一篇博文https://blog.csdn.net/ylzmm/article/details/104234099,关于简易的HTTP服务器的搭建参考这篇博文https://blog.csdn.net/ylzmm/article/details/104311190。

本文在 RT_thread给出的HTTP升级的案例(具体参考https://www.rt-thread.org/document/site/application-note/system/rtboot/an0028-rtboot/中的源码实现部分),进行了部分修改。修改了为AT指令的方式获取固件。以下是整体的升级思路和在使用AT指令获取固件时需要注意的事项。

1.AT指令获取固件 (未提供完整AT指令步骤,重点步骤提出)

发送:AT+HTTPACTION=0
应答:OK+HTTPACTION: 0,200,92240    /*200为正常的服务器返回状态 92240为固件大小*/发送:AT+HTTPREAD=0,100    /*0表示获取固件从固件头开始,100表示获取前100个字节*/
应答:                     /*100,100 表示获取从固件的100字节开始,后面100个字节*/+HTTPREAD: 100            /*本次获取的固件大小100*/
RBLk??^app2.0.000010203040506070809`?荱{qa苎餲噗?%2?  /*实际固件数据*/
OK

通过AT指令依次循环获取固件数据,获取一批固件数据,写入FLASH,以此循环。

2.固件数据的接收与写入处理

但是我在调试的过程中遇到了一个很奇特的问题。在升级固件时偶尔会出现升级失败的现象,提示固件的CRC校验错误,明显是固件数据出现了遗漏。开始的时候我一直觉得是HTTP通信的问题,通信上下载固件数据偶尔出现了掉数据,后面实际中测试发现某次固件升级不成功,他会一直不成功,无论你重复下载多少次。由此排除了通信遗漏数据问题。之前我遇到的问题可以参考论坛中这一篇https://www.rt-thread.org/qa/thread-423550-1-1.html。

采用论坛中网友的答复的方法,从而解决了这个问题。

确实。我进行AT指令的应答处理中,我遗漏了一个很严重的问题。固件数据是一堆16进制的数据,如果我以读取到OK,或者\r\n

这样的判断方式来进行判断本次接收固件数据完毕,很容易出现误判,固件数据可能存在干扰。

最后采用了以下方式成功做到了100%升级:

 /*仅仅发送 应答数据在URC函数中处理*/if (at_exec_cmd(NULL,"AT+HTTPREAD=%d,4096",len_fir) != RT_EOK){LOG_E("AT+HTTPACTION=%d,4096, send commands failed , response error or timeout !",len_fir);goto __exit;}/*发送邮件 下载的字节数*/rt_mb_send(&http_mb, (rt_uint32_t)4096);   /* 等待http数据传回 信号量 */result = rt_sem_take(http_dysem, HTTP_OTA_OUTTIME);

AT指令只是发生下载的固件的指令,不进行返回值的判断处理。一直等待一个信号量。

/*HTTP固件信息数据处理*/
static void urc_http_func(struct at_client *client ,const char *data, rt_size_t size)
{char *recv_buf = RT_NULL;int  number = 0;recv_buf = (char *)rt_calloc(1, 4096);if (rt_mb_recv(&http_mb, (rt_ubase_t *)&number, RT_WAITING_FOREVER) == RT_EOK){at_client_obj_recv(client,recv_buf,number,number);
//        /*打印接收部分数据*/
//        ulog_hexdump(LOG_TAG, 16, (rt_uint8_t *)recv_buf, number);rt_memset(firmware_http,0,sizeof(firmware_http));rt_memcpy(firmware_http,recv_buf,number);rt_sem_release(http_dysem);}rt_free(recv_buf);
}static struct at_urc urc_firmware[]= {{"+HTTPREAD:",   "\r\n",     urc_http_func},
};

通过注册URC回调函数,当接收到“+HTTPREAD:”数据时,表明了正在进入了固件下载时。于是在URC回调函数中进行接收指定的固件数的大小的数据字节即可。

更加具体的代码实现,可以去参考RT的底层上关于TCP接收服务器下发的数据的处理方法。

2020.2.23 补充几个可能遇到的问题:

1. 注意修改宏定义大小 RT_SERIAL_RB_BUFSZ 。每次重新使用ENV工具生成工程后,会被重置为64。这里应该设置为大于4096。

2. 在AT组件的ENV配置过程中,不要开启图中这一项。不知道为什么开启后,在极少的情况下,AT指令的在发送上可能会失败。

3. 注意在配置串口的引脚的电气属性时,一定记得配置上拉,不要处于浮空状态。不然在一定的情况下引脚会受到干扰。

RT_thread 使用4G模块Air720H对STM32进行OTA远程无线升级相关推荐

  1. STM32--ESP8266物联网WIFI模块(贝壳物联)--远程无线控制点灯

    本文适用于STM32F103C8T6等MCU,其他MCU可以移植,完整资源见文末链接 一.简介 随着移动物联网的发展,各场景下对于物联控制.数据上传.远程控制的诉求也越来越多,基于此乐鑫科技推出了便宜 ...

  2. 我的物联网大学【第十章】:不能远程升级的4G模块都是耍流氓

    X电(化名)曾经是共享充电宝的明星企业. 2017年10月,X电以2亿的估值,获得了天使轮融资3000万,开始迅速铺货抢占市场. 在每一个餐桌上放一个单机版本的充电宝,用户扫码付款即可充电. 第一批货 ...

  3. STM32开发 -- 4G模块开发详解(3)

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/81782682 上面两篇文章,基本上把软硬件部分讲完了.接下来我们就看一下收发 ...

  4. 基于OneNet平台设计的多节点温度采集系统-有人云4G模块+STM32

    一.设计说明 设计思路: 每个测量点采用4G+STM32+温度测量模块组成:采集温度数据之后直接上传到OneNet物联网云平台,在OneNET云平台上设计可视化界面进行显示,并且也可以在手机APP设备 ...

  5. STM32开发--4G模块开发

    一.简介 在移动通信中,经常出现GSM,GPRS,EDGE,UMTS,HSPA和LTE等术语.这些术语指的是不同的数据传输标准,并且对于移动电话用户而言主要以不同的数据传输速率是显而易见的.在这张表中 ...

  6. STM32+4G模块实战项目(连接阿里云物联网平台+OTA升级):(一)初识硬件

    STM32+4G模块实战项目(OTA升级) 构思占坑中ing.....,3天一章,请耐心等待 STM32+4G模块实战项目(连接阿里云物联网平台+OTA升级):(一)初识硬件 STM32+4G模块实战 ...

  7. 基于STM32和阿里云的矿道环境监测系统(温湿度DHT117,NRF2401(2.4G模块),气体传感器(MQ-3),0.96寸OLED屏,wifi模块)

    基于STM32和阿里云的矿道环境监测系统(温湿度DHT117,NRF2401(2.4G模块),气体传感器(MQ-3)) 系统实现的功能 系统实现的是运用一块STM32F103C8T6作为发射端节点,上 ...

  8. 基于Stm32的4G模块实现内网透传通信(代码后附)

    基于Stm32的4G模块实现内网透传通信 一.内网透传即内网映射,内网IP端口映射外网连接访问过程的实现.内网透传通信实现过程又有以下几种区别: 1)路由器映射.适合自己本地路由有公网IP网络环境,用 ...

  9. STM32开发 -- 4G模块开发详解(4)

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/82110375 前面用了三篇来讲基础知识,根据这些东西可以简单的实现4G模块的 ...

  10. STM32开发 -- 4G模块开发详解(1)

    如需转载注明出处:https://blog.csdn.net/qq_29350001/article/details/81671534 这部分一直再看,资料都已经整理好了,但是一直没有汇总.接下来就详 ...

最新文章

  1. 免费的XShell替代品,同时支持Windows,macOS,Linux!又来一款国产良心工具....
  2. R语言:rep函数解析
  3. C# 重写WndProc 消息循环
  4. LeetCode43——Multiply Strings(两个字符串表示的整数相乘)???
  5. iOS 推送通知及推送扩展
  6. vue watch 修改滚动条_vue 中滚动条始终定位在底部的方法
  7. WindowsXP如何设置共享权限
  8. ardupilot固件二次开发_【国外开源】无人机 ArduPilot Mega 控制板原理图/PCB/固件源码...
  9. 神经网络是什么,神经网络具体有什么用?
  10. 钉钉一行代码_利用Python快速搭建钉钉和邮件数据推送系统
  11. 计算机组成原理全书知识总结
  12. gorm增删查改json_go基于echo、gorm实现增删改查,从请求到落库
  13. 计算机网络隧道工程,隧道工程
  14. word转化为PDF
  15. http、TCP、IP的形象比喻
  16. 关于深度学习人工智能模型的探讨(五)(4)
  17. Cost Component Group
  18. 名编辑电子杂志大师教程 | “文件”菜单介绍
  19. KEIL中文字符乱码
  20. C语言实现 扑克牌 (4种玩法) 洗牌,发牌,整理牌

热门文章

  1. VS2019 配色_OPPO Enco M31颜值太顶了,斩获 A'设计大奖赛金奖,引领时尚潮流|oppo|大奖赛|无线耳机|配色|时尚|卡特...
  2. 重装系统时,USB接口鼠标和键盘不能使用的解决办法
  3. unity球体添加光源_Unity 3D光源-Point Light点光源详解/灯泡、模拟灯光效果教程
  4. 观 小楼老师Axure /得
  5. 3dmax导出unity3d模型设置
  6. 第四章-整合管理【核心词:批准】
  7. win10 如何启用虚拟化 Hyper-V
  8. 电脑可以登微信但是登不上网页
  9. kindle dxg汉化和安装kindlepdfviewer
  10. sketchup 计算机配置,SketchUp Pro2019对电脑硬件要求