5-51單片機ESP8266學習-AT指令(8266TCP服務器--用手機TCP調試助手發信息給單片機控制小燈的亮滅)


http://www.cnblogs.com/yangfengwu/p/8759294.html  

 

源碼鏈接:https://pan.baidu.com/s/1wT8KAOIzvkOXXNpkDI7E8g 
提取碼:1q9y 

 

自己寫好了51采集DHT11的程序,在這個的基礎上一點一點的寫,對了,自己的這一系列的文章不是講很基礎很基礎的內容,這一系列更注重於應用,如果要學基礎的請等待自己的51單片機開發板的基礎教程...

 

 

 

第一步做的是配置好51單片機的指令

 咱們在單片機一起動的時候,先控制8266的復位引腳為低電平 讓模塊復位,等待3S后判斷串口接收的數據有沒有ready,

有的話就執行下一步,沒有的話再讓模塊復位,一直這樣循環.

然后發送AT+CIPMUX=1 啟動多連接,等待1S判斷是不是接收到OK,沒有接收到再發一次,如果超過三次,重新開始,接收到執行下一步

然后發送AT+CIPSERVER=1,1001 啟動TCP服務器,等待1S判斷是不是接收到OK,沒有接收到再發一次,如果超過三次,重新開始,接收到執行下一步

 

啟動服務器成功以后就進入while(1) 循環,

接收到數據  0xaa,0x55,0x01,0x01  則發送自己的溫濕度數據   0xaa,0x55,溫度(16進制表示),濕度(16進制表示)

假設 接收到 0xaa,0x55,0x01,0x01   溫度10度,濕度50%       0xaa,0x55,,0x01,0x0a,0x32 

這一節不加任何的校驗位,后期再加

接收到數據  0xaa,0x55,0x02,0x00   控制小燈熄滅

接收到數據  0xaa,0x55,0x02,0xff     控制小燈點亮

APP端也不做任何的回復判斷什么的,力求做的簡單易懂

先做單片機端,數據回復先用串口助手模擬.....

 

先打好底

 

   

 

 

 

 設置控制8266復位的引腳為P1_0;

#ifndef ESP8266_H_
#define ESP8266_H_

#ifndef ESP8266_C_
#define ESP8266_C_ extern
#else
#define ESP8266_C_
#endif

sbit ESPRst = P1^0;

#endif

 

 咱們呢直接在主函數里面寫,

 

 

void main()
{
    InitUART(115200);
    InitTimer0();
   
    start:
    
    /*下面的都是一樣的模子,注釋就寫一個*/
    Cnt = 0;
    while(1)
    {
        printf("8266RST\r\n");//這個不是什么指令,我先用串口調試助手模擬看一下發了這條信息,然后我回它
        P0_0 = 1;//這個燈作為指示燈,發送個指令就亮,
        ESP_Rst();//復位8266
        DelayMs(3000);//等待3S
        if(UsartFlage == 1)//串口接收到數據
        {
          UsartFlage = 0;
            if(strstr(UsartReceive, "ready"))//有沒有ready
            {
                P0_0 = 0;//接收到正確的回復就滅
                DelayMs(500);
                break;
            }
      }
        Cnt ++;
        if(Cnt>=3)//超過三次重新開始
        {
          goto start;
        }
  }
    
    Cnt = 0;
    while(1)
    {
        printf("AT+CIPMUX=1\r\n");//啟動多連接
        P0_0 = 1;
        DelayMs(1000);
        if(UsartFlage == 1)
        {
            UsartFlage = 0;
            if(strstr(UsartReceive, "OK"))
            {
                P0_0 = 0;
                DelayMs(500);
                break;
            }
       }
        Cnt ++;
        if(Cnt>=3)
        {
          goto start;
        }
    }
    
    Cnt = 0;
    while(1)
    {
        printf("AT+CIPSERVER=1,1001\r\n");//創建服務器
        P0_0 = 1;
        DelayMs(1000);
        if(UsartFlage == 1)
        {
            UsartFlage = 0;
            if(strstr(UsartReceive, "OK"))
            {
                P0_0 = 0;
                DelayMs(500);
                break;
            }
        }
        Cnt ++;
        if(Cnt>=3)
        {
          goto start;
        }
  }
    
    /*讓小燈閃一閃,算是說明正確執行了把*/
  P0_0 = 0;
  DelayMs(200);
  P0_0 = 1;
  DelayMs(200);
  P0_0 = 0;
  DelayMs(200);
  P0_0 = 1;
  DelayMs(200);
  P0_0 = 0;

   

 

 

 算啦全復制粘貼過來

#define MAIN_C_
#include "include.h"

/**
* 介紹:  主函數
* 說明:  每間隔1S發送一次溫濕度數據
* 說明:  返回串口接收到的數據,發送方式為中斷發送
* 說明:  None
* 說明:  None
* 支持:  QQ946029359 --群 607064330
* 淘寶:  https://shop411638453.taobao.com/
* 作者:  小五
**/

unsigned char Cnt = 0;
unsigned char ConnectID = 0;
unsigned char i=0;
void main()
{
    InitUART(115200);
    InitTimer0();
   
    start:
    
    /*下面的都是一樣的模子,注釋就寫一個*/
    Cnt = 0;
    while(1)
    {
        printf("8266RST\r\n");//這個不是什么指令,我先用串口調試助手模擬
        P0_0 = 1;//這個燈作為指示燈,發送個指令就亮,
        ESP_Rst();//復位8266
        DelayMs(3000);//等待3S
        if(UsartFlage == 1)//串口接收到數據
        {
          UsartFlage = 0;
            if(strstr(UsartReceive, "ready"))//有沒有ready
            {
                P0_0 = 0;//接收到正確的回復就滅
                DelayMs(500);
                break;
            }
      }
        Cnt ++;
        if(Cnt>=3)//超過三次重新開始
        {
        goto start;
      }
  }
    
    Cnt = 0;
    while(1)
    {
        printf("AT+CIPMUX=1\r\n");//啟動多連接
        P0_0 = 1;
        DelayMs(1000);
        if(UsartFlage == 1)
        {
          UsartFlage = 0;
            if(strstr(UsartReceive, "OK"))
            {
                P0_0 = 0;
                DelayMs(500);
                break;
            }
      }
        Cnt ++;
        if(Cnt>=3)
        {
        goto start;
      }
  }
    
    Cnt = 0;
    while(1)
    {
        printf("AT+CIPSERVER=1,1001\r\n");//創建服務器
        P0_0 = 1;
        DelayMs(1000);
        if(UsartFlage == 1)
        {
          UsartFlage = 0;
            if(strstr(UsartReceive, "OK"))
            {
                P0_0 = 0;
                DelayMs(500);
                break;
            }
    }
        Cnt ++;
        if(Cnt>=3)
        {
        goto start;
      }
  }
    
    /*讓小燈閃一閃,算是說明正確執行了把*/
  P0_0 = 0;
  DelayMs(200);
  P0_0 = 1;
  DelayMs(200);
  P0_0 = 0;
  DelayMs(200);
  P0_0 = 1;
  DelayMs(200);
  P0_0 = 0;
    
    
    while(1)
    {
      DHT11_Receive(); 
        
        DelayMs(1000);
    
        printf("data;T=%d,H=%d\r\n",(int)DHT11Data[0],(int)DHT11Data[2]);
        
//         if(UsartFlage == 1)//返回接收的數據
//         {
//       UsartFlage = 0;
//             
//             for(i=0;i<10;i++)//找到開始的數據位置,有的固件數據前頭有換行,有的沒有
//             {
//         if(UsartReceive[i]=='+' && UsartReceive[i+1]=='I'&& UsartReceive[i+2]=='P')//判斷數據的頭
//                 {
//                     ConnectID = UsartReceive[i+5];//得到是幾號連接的
//                     if(ConnectID>=0x30 && ConnectID<=0x34)//得到的ID號有沒有越界
//                     {
//                          for(i=6;i<15;i++)//找到 : 在哪里,才知道真實數據在哪里
//                          {
//                                 if(UsartReceive[i] == ':')
//                                 {
//                                     if(UsartReceive[i+1]==0xaa  && UsartReceive[i+2]==0x55)
//                                     {
//                                          switch(UsartReceive[i+3])
//                                          {
//                                                 case 0x01: break;//發送溫濕度數據
//                                                 case 0x02: if(UsartReceive[i+4] == 0x00)
//                                                                      {
//                                                                          P0_0 = 0;
//                                                                      } 
//                                                                      else if(UsartReceive[i+4] == 0xff)
//                                                                      {
//                                                                          P0_0 = 1;
//                                                                      }
//                                                                      break;//發送溫濕度數據
//                                                                      
//                                                 default:break;                          
//                                          }
//                                          break;//結束for(i=6;i<15)
//                                     }
//                                 }
//                          }
//                          
//                          break;//結束for(i=0;i<10;i++)
//                     }
//                 }
//       }
            
    //}
    
  }
}

把現在的程序下進去,然后測試

 

 現在說一下接收數據

 修改一下主while(1)循環函數

    while(1)
    {
      DHT11_Receive(); 
        
//         DelayMs(1000);
//     
//         printf("data;T=%d,H=%d\r\n",(int)DHT11Data[0],(int)DHT11Data[2]);
        
        if(UsartFlage == 1)//返回接收的數據
        {
         UsartFlage = 0;for(i=0;i<10;i++)//找到開始的數據位置,有的固件數據前頭有換行,有的沒有
          {
            if(UsartReceive[i]=='+' && UsartReceive[i+1]=='I'&& UsartReceive[i+2]=='P')//判斷數據的頭
                {
                    ConnectID = UsartReceive[i+5];//得到是幾號連接的
                    if(ConnectID>=0x30 && ConnectID<=0x34)//得到的ID號有沒有越界
                    {
                         for(i=6;i<15;i++)//找到 : 在哪里,才知道真實數據在哪里
                         {
                                if(UsartReceive[i] == ':')
                                {
                                    if(UsartReceive[i+1]==0xaa  && UsartReceive[i+2]==0x55)
                                    {
                                         switch(UsartReceive[i+3])
                                         {
                                                case 0x01: break;//發送溫濕度數據
                                                case 0x02: if(UsartReceive[i+4] == 0x00)
                                                                     {
                                                                         P0_0 = 0;
                                                                     } 
                                                                     else if(UsartReceive[i+4] == 0xff)
                                                                     {
                                                                         P0_0 = 1;
                                                                     }
                                                                     break;//發送溫濕度數據
                                                                     
                                                default:break;                          
                                         }
                                         break;//結束for(i=6;i<15)
                                    }
                                }
                         }
                         
                         break;//結束for(i=0;i<10;i++)
                    }
                }
        }
            
    }
    
  }

wifi接受到數據發給單片機的格式

    

 

但是呢有的固件,是沒有前面的換行的

 

 所以我的程序

 

 接着呢我要知道我的數據在哪里,

 

 

 把現在的程序下載到單片機里面

別忘了

電腦和單片機串口通信

單片機和WIFI模塊通信

電腦和WIFI模塊通信

然后把跳線帽跳到中間,讓單片機和WIFI模塊進行通信

 

 把WIFI模塊的RST引腳接到單片機的P1_0

 

 復位一下單片機,也可以不用

 

 手機連接無線

 

 

 

 

 

 

 這篇先寫到這里,先讓大家消化消化,其實AT指令看似簡單,,其實很麻煩

 

 

 下一篇連接

http://www.cnblogs.com/yangfengwu/p/8780182.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM