美文网首页
7-51单片机ESP8266学习-AT指令(8266TCP服务器

7-51单片机ESP8266学习-AT指令(8266TCP服务器

作者: 杨奉武 | 来源:发表于2018-04-26 18:59 被阅读78次

    http://www.cnblogs.com/yangfengwu/p/8759294.html 如不做任何说明默认最头上的链接为上一篇链接,末尾的链接为下一篇链接

    先把源码和资料链接放到这里

    链接:https://pan.baidu.com/s/10MxI8-Q33-M_R2WEHqEi1A密码:j1sz

    自己写好了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_#defineESP8266_H_#ifndef ESP8266_C_#defineESP8266_C_ extern#else#defineESP8266_C_#endifsbit ESPRst = P1^0;#endif

    咱们呢直接在主函数里面写,

    void main()

    {

        InitUART(115200);

        InitTimer0();

        start:

        /*下面的都是一样的模子,注释就写一个*/    Cnt =0;

        while(1)

        {

            printf("8266RST\r\n");//这个不是什么指令,我先用串口调试助手模拟看一下发了这条信息,然后我回它P0_0 =1;//这个灯作为指示灯,发送个指令就亮,ESP_Rst();//复位8266DelayMs(3000);//等待3Sif(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;

     算啦全复制粘贴过来

    #defineMAIN_C_#include "include.h"/**

    * 介绍:  主函数

    * 说明:  每间隔1S发送一次温湿度数据

    * 说明:  返回串口接收到的数据,发送方式为中断发送

    * 说明:  None

    * 说明:  None

    * 支持:  QQ946029359 --群 607064330

    * 淘宝:  https://shop411638453.taobao.com/* 作者:  小五

    **/unsigned charCnt =0;

    unsigned charConnectID =0;

    unsigned chari=0;void main()

    {

        InitUART(115200);

        InitTimer0();

        start:

        /*下面的都是一样的模子,注释就写一个*/    Cnt =0;

        while(1)

        {

            printf("8266RST\r\n");//这个不是什么指令,我先用串口调试助手模拟P0_0 =1;//这个灯作为指示灯,发送个指令就亮,ESP_Rst();//复位8266DelayMs(3000);//等待3Sif(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])

                                            {

                                                    case0x01:break;//发送温湿度数据case0x02:if(UsartReceive[i+4] ==0x00)

                                                                        {

                                                                            P0_0 =0;

                                                                        }

                                                                        elseif(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

    复位一下单片机,也可以不用

     手机连接无线

    这篇先写到这里,先让大家消化消化

    下一篇连接

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

    相关文章

      网友评论

          本文标题:7-51单片机ESP8266学习-AT指令(8266TCP服务器

          本文链接:https://www.haomeiwen.com/subject/ppvmlftx.html