11-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(远程升级STM32程序,基于WIFI(AT指令TCP透传),STM32主动升级版)

https://www.cnblogs.com/yangfengwu/p/10858262.html


视频教程

https://www.bilibili.com/video/av55149706


请先自行补充基础内容  

https://www.cnblogs.com/yangfengwu/p/6921832.html


https://www.cnblogs.com/yangfengwu/category/1383497.html1-3节


 终于可以了,8266AT指令版本,实现远程升级单片机程序....主要问题是两个printf离得太近,wifi当成一个数据了





先说明一下,如果自己不是用的8266应该修改的地方,由于只是IAP程序里面实现的升级,所以只需要修改IAP程序就可以,大家可以在用户程序里面实现自己的具体功能,如果想升级,就复位一下单片机就可以


其实程序和上一版并没有太大改动...连解析协议都没动,只是修改链接TCP的函数而已













还有个地方需要注意:http数据解析的地方


我现在用的是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比较好一些,因为灵活


https://www.cnblogs.com/yangfengwu/p/10886436.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容