小米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));	
			}
我在写代码的时候也参考了这位博主的[文章](https://blog.csdn.net/gin_love/article/details/85772243)
希望此文对你有帮助!

你可能感兴趣的:(小米wifi esp8266模组OTA总结)