https://www.cnblogs.com/yangfengwu/p/10875886.html
視頻教程
https://www.bilibili.com/video/av55154287
請(qǐng)先自行補(bǔ)充基礎(chǔ)內(nèi)容 ?
先看上一節(jié),上一節(jié)
https://www.cnblogs.com/yangfengwu/p/6921832.html
https://www.cnblogs.com/yangfengwu/category/1383497.html1-3節(jié)
?監(jiān)控了下數(shù)據(jù)
...........
\r\n\r\n+IPD,1440:
需要去掉這個(gè),,,,,,
問(wèn)題記錄,瘋狂打印起來(lái)...后來(lái)想到了原因,WIFI開啟了回顯模式..發(fā)給他什么,他就會(huì)回什么..所以關(guān)掉這個(gè)模式
一開始為測(cè)試其它問(wèn)題,把這個(gè)數(shù)組調(diào)節(jié)的比較大
?造成用戶程序運(yùn)行不起來(lái)....我親自對(duì)比了所有的下載的數(shù)據(jù),發(fā)現(xiàn)沒(méi)有錯(cuò)誤,后來(lái)一想應(yīng)該是這個(gè)的問(wèn)題.....
程序終于可以了.....
?這一節(jié)的功能和上一節(jié)一樣,就不再演示,主要說(shuō)幾個(gè)注意的地方
主要是更改了AT指令
所以發(fā)送數(shù)據(jù)的方式改變了,因?yàn)樾枰劝l(fā)指令,再發(fā)數(shù)據(jù)
?主要的地方是解析
void USART1_IRQHandler(void)? ? ? ? ? ? ? ? ? ? //′??ú1?D??·t??3ìDò
{
? ? u8 Res;
? ? if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
? ? {
? ? ? ? Res =USART_ReceiveData(USART1);? ? //?áè??óê?μ?μ?êy?Y
? ? ? ? if(Usart1ReadCnt < 399)
? ? ? ? {
? ? ? ? ? ? Usart1ReadBuff[Usart1ReadCnt] = Res;
? ? ? ? }
? ? ? ? else
? ? ? ? {
? ? ? ? ? ? Usart1ReadCnt=0;
? ? ? ? }
? ? ? ? Usart1ReadCnt ++;? ? //êy?Y??êy
? ? ? ? Usart1IdleCnt = 0;
? ? ? ? /*?óê??üD?3ìDò*/
? ? ? ? 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')//確定第一個(gè)是數(shù)字
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? IPDFlage = 0;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? else if(IPDCnt>=9 && IPDCnt<=12)//數(shù)據(jù)最長(zhǎng)的也就是? \r\n+IPD,XXXX:
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? if(Res == ':')
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? IPDFlage=0;
? ? ? ? ? ? ? ? ? ? ? ? ? ? IPDCnt=0;
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? else if(IPDCnt>12)//Apache 最大發(fā)送的是1440 應(yīng)該進(jìn)不了這個(gè),
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? UpdateOverflow = 1;//如果進(jìn)入....就默認(rèn)數(shù)組溢出吧
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? if(!IPDFlage && IPDCnt>0)
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? if(PutData(IPDtemp,IPDCnt) == -1)
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? UpdateOverflow = 1;
? ? ? ? ? ? ? ? ? ? ? ? }? ?
? ? ? ? ? ? ? ? ? ? ? ? IPDCnt=0;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? if(PutData(&Res,1) == -1)
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? UpdateOverflow = 1;
? ? ? ? ? ? ? ? ? ? }? ?
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? else//?y3£êy?Y
? ? ? ? {
? ? ? ? ? ? //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 )//êy?Y×?3¤99999999??×??ú,??′ó16?éμ÷???óê?×??ú??êy
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? 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)//?a??μ?httpí·êy?Yμ??22?
? ? ? ? {
? ? ? ? ? ? Usart1ReadHttpHeadEndOK=0;
? ? ? ? ? ? Usart1ReadHttpHeadCnt = 0;
? ? ? ? ? ? Usart1ReadHttpDataLengthOK=0;
? ? ? ? ? ? if(Status==2)//·¢?íμ?ê??ˉ?ê3ìDò
? ? ? ? ? ? {
? ? ? ? ? ? ? ? UpdateStartFlage = 1;//??′?μ?êy?YD′è?á′±í
? ? ? ? ? ? ? ? SysTickIdleTime = 2000;//空閑時(shí)間改為2S,,注意不要改到3S以上,因?yàn)閭鬏斖陻?shù)據(jù)http 大約3S后會(huì)自動(dòng)斷開,WIFI會(huì)發(fā)斷開信息,,,防止把信息寫入flash
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
?操作和上一節(jié)一樣,不再做重復(fù)的工作
?由于我的底層方案比較完善,所以即使再怎么改也不會(huì)動(dòng)底層,其實(shí)所有的只是配合底層,所以無(wú)論怎么升級(jí),用什么升級(jí),只要配合底層寫連接,寫發(fā)送就好,
如果需要特定的解析,只需要在這里修改就好
學(xué)任何東西底子(基礎(chǔ))很重要,知識(shí)是用來(lái)靈活運(yùn)用的,前提是需要學(xué)透,否則只能是用,而不是靈活運(yùn)用
?有沒(méi)有理解到那句話: 爛程序員關(guān)心的是代碼,好程序員關(guān)心的是數(shù)據(jù)結(jié)構(gòu)和它們之間的關(guān)系
注意:自己寫的用戶程序里面別有printf("\r\n+IPD,XXX:") ? 因?yàn)檫h(yuǎn)程更新的時(shí)候會(huì)剔除掉....
這一節(jié)的程序其實(shí)也支持上一節(jié)透?jìng)鞯哪莻€(gè)AT模式,因?yàn)閷?shí)際上只是剔除\r\n+IPD,XXX: ?透?jìng)髂J较聸](méi)有這個(gè),現(xiàn)在的解析程序影響不到