https://www.cnblogs.com/yangfengwu/p/10875886.html
Video Tutorial
https://www.bilibili.com/video/av55154287
Please supplement their own content base
Look at the last one, on a
https://www.cnblogs.com/yangfengwu/p/6921832.html
https://www.cnblogs.com/yangfengwu/category/1383497.html Section 1-3
Monitoring the next data
...........
\r\n\r\n+IPD,1440:
We need to remove this ,,,,,,
Problem Record, crazy prints up ... Then think of reasons, WIFI opened the Echo mode .. issued to him what, he will return .. So turn off this mode
A start testing other problems, this adjustment is relatively large array
Causing the user to run it up .... I personally compare all of the downloaded data and found no errors, then I thought this should be a problem .....
Programs can finally .....
This section features and on a same, is no longer demonstrate, mainly to say a few caveats
The main change is the AT command
The transmit data thus changed, because of the need to send instructions and then send the data
The main place is resolved
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) { //剔除 \r\n+IPD,X: 或 \r\n+IPD,XX: 或 \r\n+IPD,XXX: 或 \r\n+IPD,XXXX: if(Res == 0x0D && !IPDFlage) { IPDFlage = 1; IPDCnt=0; } if(IPDFlage) { IPDtemp[IPDCnt]=Res; IPDCnt++; if(IPDCnt==2 && Res != 0x0A) { IPDFlage = 0; } else if(IPDCnt==3 && Res != '+') { IPDFlage = 0; } else if(IPDCnt==4 && Res != 'I') { IPDFlage = 0; } else if(IPDCnt==5 && Res != 'P') { IPDFlage = 0; } else if(IPDCnt==6 && Res != 'D') { IPDFlage = 0; } else if(IPDCnt==7 && Res != ',') { IPDFlage = 0; } else if(IPDCnt==8 && Res <'0' && Res >'9')//确定第一个是数字 { IPDFlage = 0; } else if(IPDCnt>=9 && IPDCnt<=12)//数据最长的也就是 \r\n+IPD,XXXX: { if(Res == ':') { IPDFlage=0; IPDCnt=0; } } else if(IPDCnt>12)//Apache 最大发送的是1440 应该进不了这个, { UpdateOverflow = 1;//如果进入....就默认数组溢出吧 } if(!IPDFlage && IPDCnt>0) { if(PutData(IPDtemp,IPDCnt) == -1) { UpdateOverflow = 1; } IPDCnt=0; } } else { 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¸ö×Ö½Ú,Ôö´ó16¿Éµ÷Õû½ÓÊÕ×Ö½Ú¸öÊý { 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;} else Usart1ReadHttpHeadCnt = 0; } } if(Usart1ReadHttpHeadEndOK == 1)//½âÎöµ½httpÍ·Êý¾ÝµÄβ²¿ { Usart1ReadHttpHeadEndOK=0; Usart1ReadHttpHeadCnt = 0; Usart1ReadHttpDataLengthOK=0; if(Status==2)//·¢Ë͵ÄÊÇѯÎʳÌÐò { UpdateStartFlage = 1;//Ï´εÄÊý¾ÝдÈëÁ´±í SysTickIdleTime = 2000;//空闲时间改为2S,,注意不要改到3S以上,因为传输完数据http 大约3S后会自动断开,WIFI会发断开信息,,,防止把信息写入flash } } } }
操作和上一节一样,不再做重复的工作
由于我的底层方案比较完善,所以即使再怎么改也不会动底层,其实所有的只是配合底层,所以无论怎么升级,用什么升级,只要配合底层写连接,写发送就好,
如果需要特定的解析,只需要在这里修改就好
学任何东西底子(基础)很重要,知识是用来灵活运用的,前提是需要学透,否则只能是用,而不是灵活运用
有没有理解到那句话: 烂程序员关心的是代码,好程序员关心的是数据结构和它们之间的关系
注意:自己写的用户程序里面别有printf("\r\n+IPD,XXX:") 因为远程更新的时候会剔除掉....
这一节的程序其实也支持上一节透传的那个AT模式,因为实际上只是剔除\r\n+IPD,XXX: 透传模式下没有这个,现在的解析程序影响不到