极简的串口升级方案
最近接了一个项目,由于固件有点大,大概为4M byte,如果使用Ymodem、modbus等协议会有ACK应答等机制对于时间效率上会有损耗,所以我们选择了一个办法,就是不用协议,在简单的命令交互之后,上位机就直接把全部的固件扔到给下位机,然后下位机在中断中将接收到的数据扔到ringbuf环形缓冲区,如果接收超时后认为固件接收完毕,然后校验固件的合法性和完整性,如果校验通过将固件烧录到Flash当中。具体的流程图可以看下图。
这个方法的局限性:
- 内存要足够大,内存的大小必须大于要升级的固件大小,因为你要分配一个很大的环形缓冲区。
- 上位机一定要按流程走,不能在发送固件的时候乱发别的数据会导致接收的固件校验不过。
- 没有重发机制,如果丢失一个字节升级就会失败,校验不过。