发新帖本帖赏金 30.00元(功能说明)我要提问
返回列表
打印
[单片机芯片]

IAP升级上位机

[复制链接]
1993|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kissdb|  楼主 | 2024-12-20 13:45 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 kissdb 于 2024-12-24 08:46 编辑

#申请原创# @21小跑堂

      最近在研究IAP,上位机没找到特别合适使用,就想着自己编写一个吧,偶然发现了aardio,不敢想象这么小巧的软件有这么多的功能,就用它来编写吧。
基本的升级流程就是先发送一个特定的字符串,等待单片机回应,回应后发送96字节的文件头(此文件头是用RTT OTA固件打包器生成的,包含了文件的大小、加密方式、CRC数据等),等待回应后就开始每次256字节发送数据,直到数据发完。为啥要选256呢,主要是单片机的最小单元是256字节,下位机不用写很复杂判断程序,直接读取写入就可以了。
上位机支持两种通信方式,串口和网口,足够适用大部分的情况了。上位机界面很简单,能够设置网址、端口、串口和波特率,下边能够显示一些调试信息。
一.界面
二.功能代码
1.获取bin文件,有需要其他格式的可以修改*.bin 为你需要的后缀名,如*.hex等,但是一般发送都是bin文件,或者RTT OTA的后缀名rbl,我是直接用的命令行生成的文件,直接重命名为bin文件了。
mainForm.btnOpen.oncommand = function(id,event){
        var path = fsys.dlg.open('bin文件|*.bin|所有文件|*.*||',,,mainForm);
        if(path){
                mainForm.editPath.text = path;
                fileFlag=1;
        }
}
2.串口发送函数
file,err = io.file(mainForm.editPath.text,"rb") //注意 io.file 默认是文本方式读出的,b指定二进制模式 
                                totalLength=file.size();
                                readlength=96;//第一次先发送文件头                        
                                mainForm.transFlieprogress.max = 100;
                                if( file )
                                {
                                    buf,readSize = file.read(readlength);                           
                                        sioPort.write(buf);
                                        length=length + readlength;
                                }

主要的代码就是先让readlength=96;//第一次先发送文件头 ,等待回应后设置为readlength=256,然后每256字节发送,发送后原来是延时一定时间,可是容易延时时间不好判断,等待单片机返回命令再发送数据,直到发送完成,每发送一次,设置一次进度条,直到发送完成显示完成。中间有任何错误都是从头开始这个流程的,没有加入断点续传的机制,主要是基于升级的文件不大,一般环境不会这么容易受干扰,重新开始耗费时间也不多(主要是懒,不想写)。串口还支持指定modbus的ID升级,输入ID后,点击设置,会向设定的ID写入一段命令,06指令,寄存器地址0x8340写入数据0x053E,下位机判断后,进入升级程序,其他从机对后续命令不响应,直到升级完成。
发送完成后等待成功命令,如果单片机接收数据正确,则返回正确命令,错误就重新发送文件,直至升级成功。开启了一个定时器,开始后每秒增加一次计数,收到发送返回命令就清零,如果次数超过一定的限值则提示超时,重新开始升级命令。
3.网口的发送函数
网口发送的函数也差不多的流程,发送函数是client.writeBuffer(buf,readSize),发送完成后要关闭文件。

file,err = io.file(mainForm.editPath.text,"rb") //注意 io.file 默认是文本方式读出的,b指定二进制模式 
                                totalLength=file.size();
                                readlength=96;//第一次先发送文件头                        
                                mainForm.transFlieprogress.max = 100;
                                if( file )
                                {
                                    buf,readSize = file.read(readlength);                           
                                        client.writeBuffer(buf,readSize);
                                        length=length + readlength;
                                }


4.升级演示



5.串口监控
当使用串口升级时,为了方便查看使用的是哪个串口,做了串口添加端口和移除端口的显示,更容易找到所使用的串口,方便对电脑不熟悉的用户使用,插入时会提示添加端口COMx,拔出时会提示移除端口COMx。









使用特权

评论回复

打赏榜单

21小跑堂 打赏了 30.00 元 2025-01-07
理由:恭喜通过原创审核!期待您多的原创作品~~不好意思,我忘记打赏了现在给您补上

评论
21小跑堂 2024-12-24 14:47 回复TA
自开发IAP上位机,实现IAP串口升级软件。 
kissdb 2024-12-20 21:39 回复TA
@21小跑堂 :重新编辑了一下 
21小跑堂 2024-12-20 16:10 回复TA
halo 大佬 感谢分享文章~~本篇文章内容不满800字未达审核门槛,您可以补充内容后再次 @ 跑堂进行审核~~ 
沙发
WoodData| | 2024-12-21 11:38 | 只看该作者
感谢分享

使用特权

评论回复
板凳
goyhuan| | 2024-12-21 13:42 | 只看该作者
谢谢分享

使用特权

评论回复
发新帖 本帖赏金 30.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

254

帖子

2

粉丝