模组OTA总结"/>
小米wifi esp8266模组OTA总结
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)); }
我在写代码的时候也参考了这位博主的[文章]()
希望此文对你有帮助!
更多推荐
小米wifi esp8266模组OTA总结
发布评论