我是靠谱客的博主 高贵悟空,这篇文章主要介绍小米wifi esp8266模组OTA总结1.串口的接收方式(不要用中断)2.开始发送NAK或者’C’传输时不能有其他字符发送给模组3.bin文件的存储,现在分享给大家,希望可以做个参考。
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错误。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17if(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个字节在进行存储
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18//这是满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)); }
复制代码
1
2
3我在写代码的时候也参考了这位博主的[文章](https://blog.csdn.net/gin_love/article/details/85772243) 希望此文对你有帮助!
最后
以上就是高贵悟空最近收集整理的关于小米wifi esp8266模组OTA总结1.串口的接收方式(不要用中断)2.开始发送NAK或者’C’传输时不能有其他字符发送给模组3.bin文件的存储的全部内容,更多相关小米wifi内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复