继续上章,具体程序处理:
一、发送部分
发送部分就是到一定的时间发送指令,其他没什么。我这里多了一个TCOTASET_wait阶段,是由于我程序是在订阅后设置版本号,此时有一个等待时间,判断是否会立即有升级任务。
二、接收部分
接收部分是最关键的地方,一般失败的话,问题都是出在这里
1、串口调试
按照我的思路的话,我会先用usb转ttl,连上4G模块的串口,豪横点的话就用2个USB转TTL,一个接tx,一个是接rx,然后尽可能的把整个流程先走一次,把信息保存txt,接收部分就对着txt的文档做处理,这样是最快的,而且出的问题也会比较少。
(因为这个腾讯云固件做ota我已经不是第一次搞,所以一开始用电脑给4G模块发送指令的报文已经找不到了,下边是我程序直接跑的时候截的报文,所以就不一条一条写,直接分开TX,RX这2部分来写了)
1、发送脚:
这里看到是按上边发送的步骤的,红色框前边的是先登录腾讯云平台,然后就是:
设置版本号(同时使能OTA)→询问ota是否使能→读取固件信息→读取固件
因为格式问题,显示会有一点乱码,这个没所谓。
2、接收脚:
使能和询问的回帧:
我程序的处理使能之后都会先询问有没有使能成功。这里有一个特殊的地方,就是esp8266经常会回复这个错误,不知道是不是询问得过快过频繁,但是我相对于其他模块感觉已经算很慢了。这个图里边,倒是没有影响程序的判断,但是在其他时候,会穿插在一个回复帧当中,就会影响。所以我做了一个处理:
直接就把他去掉了,这也是一个先串口调试看报文的好处把,能把这些问题先提前出来了。
询问固件信息回帧:
的回帧,这里包括了版本号,大小,md5的验证码
读取固件回帧:
这里我只截第一帧和最后一帧:
如果固件大小刚好是1024的倍数,那读完最后一帧后再读,会返回错误,不是1024的倍数,最后一帧会返回实际长度,所以是用这个长度来判断是否为最后一帧。
2、程序编写
1、接收4G模块下载固件信息:
4G模块接收到升级固件的命令时,会在串口发送正在更新的指令,下载完后会发送更新已完成。
2、处理固件信息。
这里就是对照上边串口打印出来的逐个处理,先是版本号,然后就是大小,md5校验码。
再计算了一下读取固件次数需要多少次,最后可以跟实际读取次数对比。我这里OTA_LEN是1024
还处理一下了207这个错误,我查了一下文档是Flash access error,遇到这个错误就重读就是了。
3、读取固件包
这里是读取最后一包后,返回error,然后md5直接校验。md5校验在网上找找就有
这里是正常读取,这里74和1是我仿真直接看的,并不是一个一个数的哈~这样比较快
4、跳转
一直判断这个标志位,然后重启。