https://www.cnblogs.com/yangfengwu/p/10858262.html
視頻教程
https://www.bilibili.com/video/av55149706
請(qǐng)先自行補(bǔ)充基礎(chǔ)內(nèi)容 ?
https://www.cnblogs.com/yangfengwu/p/6921832.html
https://www.cnblogs.com/yangfengwu/category/1383497.html1-3節(jié)
?終于可以了,8266AT指令版本,實(shí)現(xiàn)遠(yuǎn)程升級(jí)單片機(jī)程序....主要問題是兩個(gè)printf離得太近,wifi當(dāng)成一個(gè)數(shù)據(jù)了
先說明一下,如果自己不是用的8266應(yīng)該修改的地方,由于只是IAP程序里面實(shí)現(xiàn)的升級(jí),所以只需要修改IAP程序就可以,大家可以在用戶程序里面實(shí)現(xiàn)自己的具體功能,如果想升級(jí),就復(fù)位一下單片機(jī)就可以
其實(shí)程序和上一版并沒有太大改動(dòng)...連解析協(xié)議都沒動(dòng),只是修改鏈接TCP的函數(shù)而已
還有個(gè)地方需要注意:http數(shù)據(jù)解析的地方
我現(xiàn)在用的是8266透?jìng)鲗?shí)現(xiàn)的,也就是說,網(wǎng)絡(luò)回給8266什么數(shù)據(jù),8266就發(fā)給單片機(jī)什么數(shù)據(jù),不摻雜任何其他東西
如果自己的模塊回復(fù)的整個(gè)數(shù)據(jù)是這樣也可以
XXXXXX ?http數(shù)據(jù) http數(shù)據(jù) ?http數(shù)據(jù) ? ? ??
這樣的不可以
XXXXXX http數(shù)據(jù) XXXX http數(shù)據(jù) ?XXXX http數(shù)據(jù)
需要在這里剔除,...算了,我再做一版.....下一節(jié)吧
這是我的數(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)
? ? ? ? ? ? {
? ? ? ? ? ? ? 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 )//數(shù)據(jù)設(shè)置的最大是99999999個(gè)字節(jié)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? 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;//把程序?qū)懭腈湵?/p>
? ? ? ? ? ? ? ? SysTickIdleTime = 5000;//超時(shí)時(shí)間大一點(diǎn)
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
現(xiàn)在看使用
1,給Wi-Fi刷AT指令的固件.依照自己的模塊選擇
2,下載單片機(jī)程序(先看一下后面的說明再下載)
因?yàn)閃IFI需要聯(lián)網(wǎng),程序默認(rèn)加入了SmartConfig配網(wǎng)
可以先運(yùn)行APP的配網(wǎng),然后按下這個(gè)按鈕
配網(wǎng)APP直接用,就可以,也支持微信配網(wǎng)
?當(dāng)然如果不想配網(wǎng)可以
根據(jù)自己的修改
3,服務(wù)器
其實(shí)服務(wù)器上和上一節(jié)一樣,用戶程序沒有任何的改動(dòng),直接用上一節(jié)的就可以(記得修改為自己的IP地址哈)
我沒有再弄個(gè)單片機(jī)型號(hào),因?yàn)闆]有必要.......盡量不做重復(fù)的工作
?4,測(cè)試,非SmartConfig
下載
?去云端修改下版本
現(xiàn)在說一下SmartConfig的
SmartConfig的我只寫在了IAP程序里面
復(fù)位單片機(jī),(10S之前)按下這個(gè)PB5按鍵哈,,如果執(zhí)行了用戶程序就不可以了,大家自己可以把這個(gè)按鈕在用戶程序里面再實(shí)現(xiàn)一下這個(gè)功能也可以..
?大家可以復(fù)位單片機(jī)以后一直按著這個(gè)按鈕,
看到這個(gè)燈亮了再松開
?打開APP
?只要配上網(wǎng)其實(shí)就代替了
?用SmartConfig比較好一些,因?yàn)殪`活