https://www.cnblogs.com/yangfengwu/p/10875886.html
终于可以了,8266AT指令版本,实现远程升级单片机程序....主要问题是两个printf离得太近,wifi当成一个数据了
先说明一下,如果自己不是用的8266应该修改的地方,由于只是IAP程序里面实现的升级,所以只需要修改IAP程序就可以,大家可以在用户程序里面实现自己的具体功能,如果想升级,就复位一下单片机就可以
其实程序和上一版并没有太大改动...连解析协议都没动,只是修改链接TCP的函数而已
还有个地方需要注意:http数据解析的地方
我现在用的是8266透传实现的,也就是说,网络回给8266什么数据,8266就发给单片机什么数据,不掺杂任何其他东西
如果自己的模块回复的是这样也可以
XXXXXX http数据 http数据 http数据
这样的不可以
XXXXXX http数据 XXXX http数据 XXXX http数据
需要在这里剔除,...算了,我再做一版.....下一节吧
这是我的数据解析部分
void USART1_IRQHandler(void) //´®¿Ú1ÖжϷþÎñ³ÌÐò { u8 Res; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { Res =USART_ReceiveData(USART1); //¶ÁÈ¡½ÓÊÕµ½µÄÊý¾Ý if(Usart1ReadCnt < 399) { Usart1ReadBuff[Usart1ReadCnt] = Res; } else { Usart1ReadCnt=0; } Usart1ReadCnt ++; //Êý¾Ý¸öÊý Usart1IdleCnt = 0; /*½ÓÊÕ¸üгÌÐò*/ if(UpdateStartFlage == 1) { if(UpdateOverflow==0) { if(PutData(&Res,1) == -1)//没有溢出 { UpdateOverflow = 1;//溢出 } } } else//Õý³£Êý¾Ý { //HTTP/1.1 200 OK //HTTP/1.1 400 Bad Request if(!Usart1ReadHttpHeadOK) { if(Res=='H' && Usart1ReadHttpHeadCnt==0)Usart1ReadHttpHeadCnt++; else if(Res=='T' && Usart1ReadHttpHeadCnt==1)Usart1ReadHttpHeadCnt++; else if(Res=='T' && Usart1ReadHttpHeadCnt==2)Usart1ReadHttpHeadCnt++; else if(Res=='P' && Usart1ReadHttpHeadCnt==3)Usart1ReadHttpHeadCnt++; else if(Res=='/' && Usart1ReadHttpHeadCnt==4)Usart1ReadHttpHeadCnt++; else if(Res=='1' && Usart1ReadHttpHeadCnt==5)Usart1ReadHttpHeadCnt++; else if(Res=='.' && Usart1ReadHttpHeadCnt==6)Usart1ReadHttpHeadCnt++; else if(Res=='1' && Usart1ReadHttpHeadCnt==7)Usart1ReadHttpHeadCnt++; else if(Res==' ' && Usart1ReadHttpHeadCnt==8)Usart1ReadHttpHeadCnt++; else if(Res=='2' && Usart1ReadHttpHeadCnt==9)Usart1ReadHttpHeadCnt++; else if(Res=='0' && Usart1ReadHttpHeadCnt==10)Usart1ReadHttpHeadCnt++; else if(Res=='0' && Usart1ReadHttpHeadCnt==11)Usart1ReadHttpHeadCnt++; else if(Res==' ' && Usart1ReadHttpHeadCnt==12)Usart1ReadHttpHeadCnt++; else if(Res=='O' && Usart1ReadHttpHeadCnt==13)Usart1ReadHttpHeadCnt++; else if(Res=='K' && Usart1ReadHttpHeadCnt==14){Usart1ReadHttpHeadOK = 1;Usart1ReadHttpHeadCnt=0;Usart1ReadHttpDataLength=0;} else { Usart1ReadHttpHeadCnt=0; } } //Content-Length: XXXXXXXX if(Usart1ReadHttpHeadOK && !Usart1ReadHttpDataLengthOK) { if(Res=='-' && Usart1ReadHttpHeadCnt==0) Usart1ReadHttpHeadCnt++; else if(Res=='L' && Usart1ReadHttpHeadCnt==1)Usart1ReadHttpHeadCnt++; else if(Res=='e' && Usart1ReadHttpHeadCnt==2)Usart1ReadHttpHeadCnt++; else if(Res=='n' && Usart1ReadHttpHeadCnt==3)Usart1ReadHttpHeadCnt++; else if(Res=='g' && Usart1ReadHttpHeadCnt==4)Usart1ReadHttpHeadCnt++; else if(Res=='t' && Usart1ReadHttpHeadCnt==5)Usart1ReadHttpHeadCnt++; else if(Res=='h' && Usart1ReadHttpHeadCnt==6)Usart1ReadHttpHeadCnt++; else if(Res==':' && Usart1ReadHttpHeadCnt==7)Usart1ReadHttpHeadCnt++; else if(Res==' ' && Usart1ReadHttpHeadCnt==8)Usart1ReadHttpHeadCnt++; else if(Usart1ReadHttpHeadCnt>=9 && Usart1ReadHttpHeadCnt<=16 )//数据设置的最大是99999999个字节 { if(Res!=0x0D) { Usart1ReadHttpDataLength = Usart1ReadHttpDataLength*10 + Res - '0'; Usart1ReadHttpHeadCnt++; } else { Usart1ReadHttpDataLengthOK = 1; Usart1ReadHttpHeadCnt = 0; } } else { Usart1ReadHttpHeadCnt = 0; } } //0D 0A 0D 0A if(Usart1ReadHttpHeadOK && Usart1ReadHttpDataLengthOK && Usart1ReadHttpDataLength && !Usart1ReadHttpHeadEndOK) { if(Res==0x0D && Usart1ReadHttpHeadCnt==0)Usart1ReadHttpHeadCnt++; else if(Res==0x0A && Usart1ReadHttpHeadCnt==1)Usart1ReadHttpHeadCnt++; else if(Res==0x0D && Usart1ReadHttpHeadCnt==2)Usart1ReadHttpHeadCnt++; else if(Res==0x0A && Usart1ReadHttpHeadCnt==3){Usart1ReadHttpHeadEndOK = 1;PCout(13) =1;} else Usart1ReadHttpHeadCnt = 0; } } if(Usart1ReadHttpHeadEndOK == 1)//http 头解析完成 { Usart1ReadHttpHeadEndOK=0; Usart1ReadHttpHeadCnt = 0; Usart1ReadHttpDataLengthOK=0; if(Status==2)//询问的是程序 { UpdateStartFlage = 1;//把程序写入链表 SysTickIdleTime = 5000;//超时时间大一点 } } } }
现在看使用
1,给Wi-Fi刷AT指令的固件.依照自己的模块选择