10-51單片機ESP8266學習-AT指令(ESP8266連接路由器,建立TCP服務器,分別和C#TCP客戶端和AndroidTCP客戶端通信+花生殼遠程通信)


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

 

先把源碼和資料鏈接放到這里

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

 

前幾篇是介紹的模塊建立TCP服務器,不連接路由器,然后進行通信呢,連接路由器最大的好處就是可以實現遠程控制

今天呢有喜有悲,悲喜交加,板子終於開始貼片了....

 

今天最讓人開心的事情是自己剛做的GPRS的板子和51學習的板子雖然自己馬虎畫錯了一個地方起初也不知道...,但是嘉立創的客服今天打電話說自己那個地方有點問題,然后給自己修改了過來,,,現在感覺在嘉立創做板子就是放心,真的.不是打廣告哈,感覺人家的服務就是好

現在看一下自己畫的不對的地方

現在只看機械層和底層

直接一個打孔就干掉了這條線..................機械層在畫板子的時候如果不注意........下次一定要時刻提醒着自己,畫完板子單獨看一下機械層和頂層或底層,容易忘

 

現在接着說

其實連接路由器就一條指令

其實應該還有配置設置自己的IP地址固定住,一會在說,咱先連接路由器,然后開啟TCP,然后看一下模塊的IP,然后進行通信

剛才測試發現一個問題,如果配置了連接無線了(而且保存了),那么上電后模塊

 

那么咱們以前的程序就不能用了,,,不能是等待3s后判斷有沒有ready,,,,應該是復位以后一直檢測有沒有回復ready,超過3S沒有回復就再發送一次指令,發送的指令超過3次

那么咱就重新開始

看一個就行,,,下面的都一樣

    /*下面的都是一樣的模子,注釋就寫一個*/
    Cnt = 0;
    CntCnt = 0;
    SendDataFlage = 1;
    while(1)
    {
        if(SendDataFlage == 1)//發送指令
        {
          SendDataFlage = 0;
          printf("8266RST\r\n");//這個不是什么指令,我先用串口調試助手模擬
          P0_0 = 1;//這個燈作為指示燈,發送個指令就亮,
          ESP_Rst();//復位8266
       }
        
        DelayMs(1);
        if(UsartFlage == 1)//串口接收到數據
        {
            UsartFlage = 0;
            if(strstr(UsartReceive, "ready"))//有沒有ready
            {
                P0_0 = 0;//接收到正確的回復就滅
                DelayMs(500);
                break;
            }
         }
        
        Cnt ++;
        if(Cnt>=3000)//每間隔3S發送一次數據
        {
            SendDataFlage = 1;//允許發送數據
            Cnt = 0;
            CntCnt++;
         }
        if(CntCnt>=3)//超過三次重新開始
        {
            CntCnt = 0;
            Cnt = 0;
            goto start;
        }
  }

 

 

所以現在的程序

#define MAIN_C_
#include "include.h"

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

int Cnt = 0;
unsigned char CntCnt = 0;
unsigned char SendDataFlage = 0;

unsigned char ConnectID = 0;
unsigned char i=0;
unsigned char SendDataValue[6]={0xaa,0x55};
int ReadDHT11delay = 0;//設置多少時間讀一次DHT11;
void main()
{
    InitUART(115200);
    InitTimer0();
   
    start:
    
    /*下面的都是一樣的模子,注釋就寫一個*/
    Cnt = 0;
    CntCnt = 0;
    SendDataFlage = 1;
    while(1)
    {
        if(SendDataFlage == 1)//發送指令
        {
            SendDataFlage = 0;
      printf("8266RST\r\n");//這個不是什么指令,我先用串口調試助手模擬
          P0_0 = 1;//這個燈作為指示燈,發送個指令就亮,
          ESP_Rst();//復位8266
    }
        
        DelayMs(1);
        if(UsartFlage == 1)//串口接收到數據
        {
      UsartFlage = 0;
            if(strstr(UsartReceive, "ready"))//有沒有ready
            {
                P0_0 = 0;//接收到正確的回復就滅
                DelayMs(500);
                break;
            }
    }
        
        Cnt ++;
        if(Cnt>=3000)//每間隔3S發送一次數據
        {
            SendDataFlage = 1;//允許發送數據
            Cnt = 0;
            CntCnt++;
    }
        if(CntCnt>=3)//超過三次重新開始
        {
            CntCnt = 0;
            Cnt = 0;
            goto start;
        }
        
  }
    
    /*配置連接路由器*/
    Cnt = 0;
    CntCnt = 0;
    SendDataFlage = 1;
    while(1)
    {
        if(SendDataFlage)
        {
            SendDataFlage = 0;
            printf("AT+CWJAP_DEF=\"qqqqq\",\"11223344\"\r\n");//連接路由器
          P0_0 = 1;
        }
        
        DelayMs(1);
        if(UsartFlage == 1)
        {
      UsartFlage = 0;
            if(strstr(UsartReceive, "OK"))
            {
                P0_0 = 0;
                DelayMs(500);
                break;
            }
    }
        
        Cnt ++;
        if(Cnt>=3000)//每間隔3S發送一次數據
        {
            SendDataFlage = 1;//允許發送數據
            Cnt = 0;
            CntCnt++;
    }
        if(CntCnt>=3)//超過三次重新開始
        {
            CntCnt = 0;
            Cnt = 0;
            goto start;
        }
  }
    
    
    /*配置模式*/
  Cnt = 0;
    CntCnt = 0;
    SendDataFlage = 1;
    while(1)
    {
        if(SendDataFlage)
        {
      SendDataFlage = 0;
            printf("AT+CWMODE_DEF=3\r\n");//AP+Station
          P0_0 = 1;
    }
        DelayMs(1);
        if(UsartFlage == 1)
        {
      UsartFlage = 0;
            if(strstr(UsartReceive, "OK"))
            {
                P0_0 = 0;
                DelayMs(500);
                break;
            }
    }
        Cnt ++;
        if(Cnt>=3000)//每間隔3S發送一次數據
        {
            SendDataFlage = 1;//允許發送數據
            Cnt = 0;
            CntCnt++;
    }
        if(CntCnt>=3)//超過三次重新開始
        {
            CntCnt = 0;
            Cnt = 0;
            goto start;
        }
  }
    
    /*多連接*/
    Cnt = 0;
    CntCnt = 0;
    SendDataFlage = 1;
    while(1)
    {
        if(SendDataFlage)
        {
      SendDataFlage = 0;
            printf("AT+CIPMUX=1\r\n");//啟動多連接
          P0_0 = 1;
    }
        
        DelayMs(1);
        if(UsartFlage == 1)
        {
      UsartFlage = 0;
            if(strstr(UsartReceive, "OK"))
            {
                P0_0 = 0;
                DelayMs(500);
                break;
            }
    }
        Cnt ++;
        if(Cnt>=3000)//每間隔3S發送一次數據
        {
            SendDataFlage = 1;//允許發送數據
            Cnt = 0;
            CntCnt++;
    }
        if(CntCnt>=3)//超過三次重新開始
        {
            CntCnt = 0;
            Cnt = 0;
            goto start;
        }
  }
    /*創建服務器*/
    Cnt = 0;
    CntCnt = 0;
    SendDataFlage = 1;
    while(1)
    {
        if(SendDataFlage)
        {
            SendDataFlage = 0;
            printf("AT+CIPSERVER=1,1001\r\n");//創建服務器
          P0_0 = 1;
        }
        
        DelayMs(1);
        if(UsartFlage == 1)
        {
      UsartFlage = 0;
            if(strstr(UsartReceive, "OK"))
            {
                P0_0 = 0;
                DelayMs(500);
                break;
            }
    }
        Cnt ++;
        if(Cnt>=3000)//每間隔3S發送一次數據
        {
            SendDataFlage = 1;//允許發送數據
            Cnt = 0;
            CntCnt++;
    }
        if(CntCnt>=3)//超過三次重新開始
        {
            CntCnt = 0;
            Cnt = 0;
            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)
    {
        
        if(TimeCnt>=200)
        {
            TimeCnt = 0;
            DHT11_Receive(); 
        }
        
        
        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:  SendDataValue[2] = 0x01;
                                                                        SendDataValue[3] = DHT11Data[0];
                                                                        SendDataValue[4] = DHT11Data[2];
                                                          ESPSendData(ConnectID-0x30,5,SendDataValue,1000);
                                                                        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++)
                    }
                }
      }
            
    }
    
  }
}

多加了一個指令(在復位后執行)

 

 對了\"  在前面介紹了哈  就是代表"

程序下進去了,現在看一下自己的路由器列表

現在測試通信

 

 

用咱做的TCP客戶端測試

 

 

 

既然連接路由器了,就可以實現遠程了

先用花生殼,,不知道還能不能用,花了6塊錢都買了一年了.....

詳細的購買花生殼過程,請參考我的這篇文章

http://www.cnblogs.com/yangfengwu/p/7736296.html#3941866

先映射

 

 

 

 

 

 對了說一下,其實直接連接模塊的無線也是可以通信的....

現在測試C#TCP客戶端

現在用花生殼連接

 

 

 

看來是解析域名出了問題直接百度

咱試一試

可以啦.....

接着再修改一下單片機的程序,8266連接路由器之后是不是因為自動分配的IP,所以對於咱來說是不是不方便哈,如果IP地址變了,,,還要查看,然后花生殼還要跟着修改,,,

現在咱固定模塊的IP

兩種方式一種是用模塊的指令,另一種是在路由器里面修改

咱先用指令修改

 

我先用串口助手配置一下看看回的內容

 

 

 

現在做單片機程序..其實就是加一個指令

/*配置連接路由器后分得的IP地址是多少*/
    Cnt = 0;
    CntCnt = 0;
    SendDataFlage = 1;
    while(1)
    {
        if(SendDataFlage)
        {
            SendDataFlage = 0;
            printf("AT+CIPSTA_DEF=\"192.168.1.106\",\"192.168.1.1\",\"255.255.255.0\"\r\n");
          P0_0 = 1;
        }
        
        DelayMs(1);
        if(UsartFlage == 1)
        {
            UsartFlage = 0;
            if(strstr(UsartReceive, "OK"))
            {
                P0_0 = 0;
                DelayMs(500);
                break;
            }
        }
        
        Cnt ++;
        if(Cnt>=3000)//每間隔3S發送一次數據
        {
            SendDataFlage = 1;//允許發送數據
            Cnt = 0;
            CntCnt++;
        }
        if(CntCnt>=3)//超過三次重新開始
        {
            CntCnt = 0;
            Cnt = 0;
            goto start;
        }
  }

 

現在也設置一下花生殼

咱用手機遠程連接一下

 

現在用路由器修改

咱先把程序修改的屏蔽掉,

    /*配置連接路由器后分得的IP地址是多少*/
//     Cnt = 0;
//     CntCnt = 0;
//     SendDataFlage = 1;
//     while(1)
//     {
//         if(SendDataFlage)
//         {
//             SendDataFlage = 0;
//             printf("AT+CIPSTA_DEF=\"192.168.1.106\",\"192.168.1.1\",\"255.255.255.0\"\r\n");
//           P0_0 = 1;
//         }
//         
//         DelayMs(1);
//         if(UsartFlage == 1)
//         {
//       UsartFlage = 0;
//             if(strstr(UsartReceive, "OK"))
//             {
//                 P0_0 = 0;
//                 DelayMs(500);
//                 break;
//             }
//     }
//         
//         Cnt ++;
//         if(Cnt>=3000)//每間隔3S發送一次數據
//         {
//             SendDataFlage = 1;//允許發送數據
//             Cnt = 0;
//             CntCnt++;
//     }
//         if(CntCnt>=3)//超過三次重新開始
//         {
//             CntCnt = 0;
//             Cnt = 0;
//             goto start;
//         }
//   }

 

噢噢噢噢噢噢噢知道原因了

 

可以先恢復出廠設置

 

 

 

 不過模塊有問題了.................

 

 哦哦哦哦哦知道原因了....要先設置模式默認AP模式是不可以連接路由器的................以前的程序全部有BUG...................

#define MAIN_C_
#include "include.h"

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

int Cnt = 0;
unsigned char CntCnt = 0;
unsigned char SendDataFlage = 0;

unsigned char ConnectID = 0;
unsigned char i=0;
unsigned char SendDataValue[6]={0xaa,0x55};
int ReadDHT11delay = 0;//設置多少時間讀一次DHT11;
void main()
{
    InitUART(115200);
    InitTimer0();
   
    start:
    
    /*下面的都是一樣的模子,注釋就寫一個*/
    Cnt = 0;
    CntCnt = 0;
    SendDataFlage = 1;
    while(1)
    {
        if(SendDataFlage == 1)//發送指令
        {
            SendDataFlage = 0;
      printf("8266RST\r\n");//這個不是什么指令,我先用串口調試助手模擬
          P0_0 = 1;//這個燈作為指示燈,發送個指令就亮,
          ESP_Rst();//復位8266
    }
        
        DelayMs(1);
        if(UsartFlage == 1)//串口接收到數據
        {
      UsartFlage = 0;
            if(strstr(UsartReceive, "ready"))//有沒有ready
            {
                P0_0 = 0;//接收到正確的回復就滅
                DelayMs(500);
                break;
            }
    }
        
        Cnt ++;
        if(Cnt>=3000)//每間隔3S發送一次數據
        {
            SendDataFlage = 1;//允許發送數據
            Cnt = 0;
            CntCnt++;
    }
        if(CntCnt>=3)//超過三次重新開始
        {
            CntCnt = 0;
            Cnt = 0;
            goto start;
        }
  }
    
    
    /*配置模式*/
  Cnt = 0;
    CntCnt = 0;
    SendDataFlage = 1;
    while(1)
    {
        if(SendDataFlage)
        {
      SendDataFlage = 0;
            printf("AT+CWMODE_DEF=3\r\n");//AP+Station
          P0_0 = 1;
    }
        DelayMs(1);
        if(UsartFlage == 1)
        {
      UsartFlage = 0;
            if(strstr(UsartReceive, "OK"))
            {
                P0_0 = 0;
                DelayMs(500);
                break;
            }
    }
        Cnt ++;
        if(Cnt>=3000)//每間隔3S發送一次數據
        {
            SendDataFlage = 1;//允許發送數據
            Cnt = 0;
            CntCnt++;
    }
        if(CntCnt>=3)//超過三次重新開始
        {
            CntCnt = 0;
            Cnt = 0;
            goto start;
        }
  }
    
    
//     /*配置連接路由器后分得的IP地址是多少*/
//     Cnt = 0;
//     CntCnt = 0;
//     SendDataFlage = 1;
//     while(1)
//     {
//         if(SendDataFlage)
//         {
//             SendDataFlage = 0;
//             printf("AT+CIPSTA_DEF=\"192.168.1.106\",\"192.168.1.1\",\"255.255.255.0\"\r\n");
//           P0_0 = 1;
//         }
//         
//         DelayMs(1);
//         if(UsartFlage == 1)
//         {
//       UsartFlage = 0;
//             if(strstr(UsartReceive, "OK"))
//             {
//                 P0_0 = 0;
//                 DelayMs(500);
//                 break;
//             }
//     }
//         
//         Cnt ++;
//         if(Cnt>=3000)//每間隔3S發送一次數據
//         {
//             SendDataFlage = 1;//允許發送數據
//             Cnt = 0;
//             CntCnt++;
//     }
//         if(CntCnt>=3)//超過三次重新開始
//         {
//             CntCnt = 0;
//             Cnt = 0;
//             goto start;
//         }
//   }
    
    
    /*配置連接路由器*/
    Cnt = 0;
    CntCnt = 0;
    SendDataFlage = 1;
    while(1)
    {
        if(SendDataFlage)
        {
            SendDataFlage = 0;
            printf("AT+CWJAP_DEF=\"qqqqq\",\"11223344\"\r\n");//連接路由器
          P0_0 = 1;
        }
        
        DelayMs(1);
        if(UsartFlage == 1)
        {
      UsartFlage = 0;
            if(strstr(UsartReceive, "OK"))
            {
                P0_0 = 0;
                DelayMs(500);
                break;
            }
    }
        
        Cnt ++;
        if(Cnt>=3000)//每間隔3S發送一次數據
        {
            SendDataFlage = 1;//允許發送數據
            Cnt = 0;
            CntCnt++;
    }
        if(CntCnt>=3)//超過三次重新開始
        {
            CntCnt = 0;
            Cnt = 0;
            goto start;
        }
  }
    
    
    /*多連接*/
    Cnt = 0;
    CntCnt = 0;
    SendDataFlage = 1;
    while(1)
    {
        if(SendDataFlage)
        {
      SendDataFlage = 0;
            printf("AT+CIPMUX=1\r\n");//啟動多連接
          P0_0 = 1;
    }
        
        DelayMs(1);
        if(UsartFlage == 1)
        {
      UsartFlage = 0;
            if(strstr(UsartReceive, "OK"))
            {
                P0_0 = 0;
                DelayMs(500);
                break;
            }
    }
        Cnt ++;
        if(Cnt>=3000)//每間隔3S發送一次數據
        {
            SendDataFlage = 1;//允許發送數據
            Cnt = 0;
            CntCnt++;
    }
        if(CntCnt>=3)//超過三次重新開始
        {
            CntCnt = 0;
            Cnt = 0;
            goto start;
        }
  }
    /*創建服務器*/
    Cnt = 0;
    CntCnt = 0;
    SendDataFlage = 1;
    while(1)
    {
        if(SendDataFlage)
        {
            SendDataFlage = 0;
            printf("AT+CIPSERVER=1,1001\r\n");//創建服務器
          P0_0 = 1;
        }
        
        DelayMs(1);
        if(UsartFlage == 1)
        {
      UsartFlage = 0;
            if(strstr(UsartReceive, "OK"))
            {
                P0_0 = 0;
                DelayMs(500);
                break;
            }
    }
        Cnt ++;
        if(Cnt>=3000)//每間隔3S發送一次數據
        {
            SendDataFlage = 1;//允許發送數據
            Cnt = 0;
            CntCnt++;
    }
        if(CntCnt>=3)//超過三次重新開始
        {
            CntCnt = 0;
            Cnt = 0;
            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)
    {
        
        if(TimeCnt>=200)
        {
            TimeCnt = 0;
            DHT11_Receive(); 
        }
        
        
        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:  SendDataValue[2] = 0x01;
                                                                        SendDataValue[3] = DHT11Data[0];
                                                                        SendDataValue[4] = DHT11Data[2];
                                                          ESPSendData(ConnectID-0x30,5,SendDataValue,1000);
                                                                        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++)
                    }
                }
      }
            
    }
    
  }
}

 

 

 

 

花生殼剛才檢測原因關了,現在重新用花生殼映射

 

 電腦端就不測試了,,,

其實這篇就改了一下單片機和C#的程序

 

 

今天...以前的源碼全有BUG.............唉

補充:

如果路由器不能上網,可以這樣

 

 注意點:

路由器橋接手機的WIFI信號后,如果沒有注意到路由器分得的IP就登錄不進路由器了,因為我們登錄不進路由器,所以映射的時候怎么知道WIFI的IP地址,咱們可以設置WiFi固定住IP,但是網關和子網掩碼呢可以看電腦的

 

 

 

 然后花生殼映射

 

 另一個手機或者本機連接這個就可以

 

下一篇鏈接

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

https://yq.aliyun.com/articles/585610

 


免責聲明!

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



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