12-STM32 things development WIFI (ESP8266) + GPRS (Air202) System Upgrade articles (STM32 remote upgrade program, based on the WIFI (AT commands TCP normal communication Edition), STM32 active Premium)

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

 

Video Tutorial

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

 Please supplement their own content base  

Look at the last one, on a

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

https://www.cnblogs.com/yangfengwu/category/1383497.html     Section 1-3

 Monitoring the next data

 

 

 

 

  ...........  

 

\r\n\r\n+IPD,1440:

 

 

We need to remove this ,,,,,,

 

Problem Record, crazy prints up ... Then think of reasons, WIFI opened the Echo mode .. issued to him what, he will return .. So turn off this mode

 

 

 

 

 

 

 

A start testing other problems, this adjustment is relatively large array

 

 

 Causing the user to run it up .... I personally compare all of the downloaded data and found no errors, then I thought this should be a problem .....

Programs can finally .....

 

 This section features and on a same, is no longer demonstrate, mainly to say a few caveats

The main change is the AT command

 

 

The transmit data thus changed, because of the need to send instructions and then send the data

 

 

 The main place is resolved

 

复制代码

复制代码

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)
            {
                //剔除 \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')//确定第一个是数字
                    {
                      IPDFlage = 0;
                    }
                    else if(IPDCnt>=9 && IPDCnt<=12)//数据最长的也就是  \r\n+IPD,XXXX:
                    {
                      if(Res == ':')
                        {
                          IPDFlage=0;
                            IPDCnt=0;
                        }
                    }
                    else if(IPDCnt>12)//Apache 最大发送的是1440 应该进不了这个,
                    {
                      UpdateOverflow = 1;//如果进入....就默认数组溢出吧
                    }
                    
                    if(!IPDFlage && IPDCnt>0)
                    {
                      if(PutData(IPDtemp,IPDCnt) == -1)
                        {
                            UpdateOverflow = 1;
                        }    
                        IPDCnt=0;
                    }
                }
                else
                {
                  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¸ö×Ö½Ú,Ôö´ó16¿Éµ÷Õû½ÓÊÕ×Ö½Ú¸öÊý
                {
                    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)//½âÎöµ½httpÍ·Êý¾ÝµÄβ²¿
        {
            Usart1ReadHttpHeadEndOK=0;
            Usart1ReadHttpHeadCnt = 0;
            Usart1ReadHttpDataLengthOK=0;
            if(Status==2)//·¢Ë͵ÄÊÇѯÎʳÌÐò
            {
                UpdateStartFlage = 1;//Ï´εÄÊý¾ÝдÈëÁ´±í
                SysTickIdleTime = 2000;//空闲时间改为2S,,注意不要改到3S以上,因为传输完数据http 大约3S后会自动断开,WIFI会发断开信息,,,防止把信息写入flash
            }
        }
    } 
} 

复制代码

复制代码

 

 操作和上一节一样,不再做重复的工作

 

 

 

  

 

 由于我的底层方案比较完善,所以即使再怎么改也不会动底层,其实所有的只是配合底层,所以无论怎么升级,用什么升级,只要配合底层写连接,写发送就好,

如果需要特定的解析,只需要在这里修改就好

学任何东西底子(基础)很重要,知识是用来灵活运用的,前提是需要学透,否则只能是用,而不是灵活运用

 

 

 

 

 有没有理解到那句话: 烂程序员关心的是代码,好程序员关心的是数据结构和它们之间的关系

 

注意:自己写的用户程序里面别有printf("\r\n+IPD,XXX:")   因为远程更新的时候会剔除掉....

 

这一节的程序其实也支持上一节透传的那个AT模式,因为实际上只是剔除\r\n+IPD,XXX:  透传模式下没有这个,现在的解析程序影响不到

 

 

 

 

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

Guess you like

Origin blog.csdn.net/qq_14941407/article/details/93321394