zoukankan      html  css  js  c++  java
  • 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
    ");//这个不是什么指令,我先用串口调试助手模拟看一下发了这条信息,然后我回它
            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
    ");//启动多连接
            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
    ");//创建服务器
            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
    ");//这个不是什么指令,我先用串口调试助手模拟
            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
    ");//启动多连接
            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
    ");//创建服务器
            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
    ",(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
    ",(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

  • 相关阅读:
    Hive安装
    hbase安装
    Spring boot 出现的时间
    RESTful Web API 实践
    Java的进阶之道
    Spring boot 注解简单备忘
    使用 xshell 登录 Windows 的 linux 子系统
    Nginx 实用配置
    跟着大彬读源码
    跟着大彬读源码
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/8776712.html
Copyright © 2011-2022 走看看