概述
OTA从学Xmodem到IAP到执行完成花费了我很多时间,下面总结几条注意事项
点击付费源码
1.串口的接收方式(不要用中断)
原本小米wifi通讯的时候,我用的就是串口中断去接收字符的,所以OTA的时候也打算沿用中断接收,后来就是坑啊,告诉小伙伴们千万别用串口中断接收去做OTA,因为传输慢的要死,小米用的Xmodem协议和标准的Xmodem稍微有变动,它不像标准Xmodem同一帧不会重复发送,小米的Xmodem的同一帧,只要不回复ACK会每隔一秒继续发本帧。直到重复发送25次后,停止发送。这时候用中断接收会出现字节错位的现象,是能完成OTA的,但是时间需要约0.5s每帧,太慢了。
模组升级,大小600KB的时间大概15~20s左右,如果网络状态很糟糕的时候可能会到1分钟。
MCU升级,受串口的速度和xmodem 协议的影响,MCU 平均下载速度大概在每秒2~4K Bytes
2.开始发送NAK或者’C’传输时不能有其他字符发送给模组
文档上说:“第一个NAK或C用于确定校验方式,第二个NAK或C开始传输数据。因此超时时间不宜过长“,就是在此时,要发送其他无关的字符。不然会现Xmodem错误。
if(checkType==CHECK_CRC)
//0x01 CRC校验
{
crc = 1;
g_CheckType='C';
}
else if(checkType==CHECK_SUM) //0x02 SUM校验
{
crc = 0;
g_CheckType=NAK;
}
//这条是为了在接收Xmodem屏蔽中断接收
usart_interrupt_disable(USART0, USART_INT_RBNE);
port_outbyte(g_CheckType);
port_outbyte(g_CheckType);
3.bin文件的存储
由于xmodem是128个数据字节一传,我采用的方法:每超出2048个字节就earse2048字节的空间出来,然后每传过来128个字节就放到数组里,直到满2048个字节在进行存储
//这是满2048的情况下
if(((packetno)%16 == 0)&&(Count_ALLBYTE >128))//满2048
{
OTA_128whole_flag = 0;
FLASH_Program(Ota_Write_Address+page_num,FMC_PAGE_SIZE,OTA_flash);
page_num += FMC_PAGE_SIZE;
}
//如果EOT了,不满2048的情况下就把剩下的存入进flash里
//OTA_flash[2048]是局部数组变量
case EOT: //数据包结束
if(OTA_128whole_flag == 1)
{
OTA_128whole_flag = 0;
FLASH_Program(Ota_Write_Address+page_num,(Count_ALLBYTE%2048),OTA_flash);
page_num = 0;
memset(OTA_flash,0,sizeof(OTA_flash));
}
我在写代码的时候也参考了这位博主的[文章](https://blog.csdn.net/gin_love/article/details/85772243)
希望此文对你有帮助!
最后
以上就是高贵悟空为你收集整理的小米wifi esp8266模组OTA总结1.串口的接收方式(不要用中断)2.开始发送NAK或者’C’传输时不能有其他字符发送给模组3.bin文件的存储的全部内容,希望文章能够帮你解决小米wifi esp8266模组OTA总结1.串口的接收方式(不要用中断)2.开始发送NAK或者’C’传输时不能有其他字符发送给模组3.bin文件的存储所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复