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比较好一些,由于灵活