http://www.javashuo.com/article/p-crgoioye-eu.htmlhtml
視頻教程服務器
https://www.bilibili.com/video/av55149706微信
請先自行補充基礎內容 網絡
http://www.javashuo.com/article/p-dlcvocfk-gc.htmlide
https://www.cnblogs.com/yangfengwu/category/1383497.html 1-3節函數
終於能夠了,8266AT指令版本,實現遠程升級單片機程序....主要問題是兩個printf離得太近,wifi當成一個數據了測試
先說明一下,若是本身不是用的8266應該修改的地方,因爲只是IAP程序裏面實現的升級,因此只須要修改IAP程序就能夠,你們能夠在用戶程序裏面實現本身的具體功能,若是想升級,就復位一下單片機就能夠spa
其實程序和上一版並無太大改動...連解析協議都沒動,只是修改連接TCP的函數而已3d
還有個地方須要注意:http數據解析的地方code
我如今用的是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指令的固件.依照本身的模塊選擇
2,下載單片機程序(先看一下後面的說明再下載)
由於WIFI須要聯網,程序默認加入了SmartConfig配網
能夠先運行APP的配網,而後按下這個按鈕
配網APP直接用,就能夠,也支持微信配網
固然若是不想配網能夠
根據本身的修改
3,服務器
其實服務器上和上一節同樣,用戶程序沒有任何的改動,直接用上一節的就能夠(記得修改成本身的IP地址哈)
我沒有再弄個單片機型號,由於沒有必要.......儘可能不作重複的工做
4,測試,非SmartConfig
下載
去雲端修改下版本
如今說一下SmartConfig的
SmartConfig的我只寫在了IAP程序裏面
復位單片機,(10S以前)按下這個PB5按鍵哈,,若是執行了用戶程序就不能夠了,你們本身能夠把這個按鈕在用戶程序裏面再實現一下這個功能也能夠..
你們能夠復位單片機之後一直按着這個按鈕,
看到這個燈亮了再鬆開
打開APP
只要配上網其實就代替了
用SmartConfig比較好一些,由於靈活