自己基于 QT 写了个上位机软件,通过串口将打包好的固件(通过 rt 的打包工具 rt_ota_packaging_tool.exe 打包的)rtthread.rbl发送到单片机,走的扩展 modbus 协议。每发送一帧的大小为 256 bytes ,modbus 会对每一帧数据进行校验,校验成功则会回复上位机。上位机收到单片机的回复后接着发送下一帧,直到发送完成。所以这个过程中,升级包的每一帧都是经过校验的,但是重启后,Qboot都报校验失败,经过多次测试都是报的:EFCBC81D != body.crc: C494F1E3,说明每次下发的固件都是一样的,每次校验的结果也是一样的。报错如下:
但是,如果是通过 ymodem 来传输,则校验成功。
请问,为什么校验会失败呢?因为经过多次测试表明单片机接收到的固件是一致的,表明传输过程并没有出错,而且 modbus 本身也是有做校验的。
问题已经解决,感谢 aozima 的提示。解决步骤如下:
1、通过 ymodem 来传输固件到 download 分区,此时校验是成功的,说明单片机接收到的固件是完全正确的。通过 fal 命令将 download 分区中的数据读出来 fal probe download;fal read 0 8192;将打印出来的数据复制下来保存到 sucess.txt 文件中。
2、通过自己写的QT上位机将固件传输到 download 分区,此时校验是失败的。通过 fal 命令将 download 分区中的数据读出来 fal probe download;fal read 0 8192;将打印出来的数据复制下来保存到 failed.txt 文件中。
3、通过对比工具 WinMerge 将上面得到的两个文件 sucess.txt 和 failed.txt 进行对比,发现前面256字节的数据是完全相同的,然后256字节后就插入了一个 FF;全部对比后发现每 256 字节后都会有一个多出来的 FF;而这256字节正好是上位机读取升级文件一帧数据的长度。
4、修改 QT 上位机程序,使得读取升级文件一帧数据发送后则停止。然后对比发现256字节数据都是正确的。
上述测试,说明单片机在收到数据写入的时候,每次都偏移了一个字节。然后检查单片机程序的时候果然如此,如下:
正确应该是:
修改单片机程序后,OTA 正常!!
是个方法,但是如何回读 flash 呢?