7-51单片机ESP8266学习-AT指令(测试TCP服务器--51单片机程序配置8266,用手机TCP调试助手发信息给单片机控制小灯的亮灭)

news/2024/5/17 18:51:13 标签: 51单片机, TCP

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_
#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

 

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

 

 手机连接无线

 

 

 

 

 

 

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

 下一篇连接

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


http://www.niftyadmin.cn/n/1625886.html

相关文章

STM32 LCD英文字符显示学习笔记

开发板&#xff1a;野火指南者&#xff08;STM32F103VE&#xff09; STM32库版本&#xff1a;STM32F10x_StdPeriph_Lib_V3.5.0 IDE:KEIL5&#xff08;代码编写很不方便&#xff0c;只在编译的时候用到&#xff09; 代码编写工具&#xff1a;Source Insight 4.0&#xff08;跟读…

潇洒老师教你注塑模具使用顶针油需要注意的问题

注塑模具使用顶针油需要注意的问题 顶针在啤作过程中&#xff0c;顶针与顶针孔之间相互磨擦&#xff0c;若不经常给顶针&#xff08;或顶针孔&#xff09;打上顶针油&#xff0c;顶针就会烧坏或磨损&#xff0c;顶针孔就会磨耗变大&#xff0c;产品顶针位易出现披锋&#xff0…

潇洒职业技术培训学校丹丹老师分享分模面的设计原理

潇洒职业技术培训学校丹丹老师分享分模面的设计原理和步骤 1.分模面的定义 分模面是指分开模具取出产品和浇注系统凝料的可分离的接触表面。一副模具根据需要可能一个或两个以上的分模面&#xff0c;分模面可以是垂直于合模方向&#xff0c;也可以与合模方向平行或倾斜。 2.分模…

品《架构漫谈》

品《架构漫谈》 经过观摩了九篇《架构漫谈》博客后&#xff0c;从中学到了很多软件体系架构的知识&#xff0c;从此盖在架构上神秘面纱被掀开了&#xff0c;下面我将体会到的几点感悟与大家分享&#xff1a; 首先为何会产生架构&#xff1f;当人们对人类生存所做出的工作进行分…

域名与服务器 ip地址的理解

域名 服务器 ip地址具有怎样的关系呢 通俗的讲&#xff0c;我们访问一个网站就相当于访问一个服务器的文件&#xff0c;如果想要通过自己的域名来访问一个网站&#xff0c;首先得将域名部署到你的服务器上&#xff0c;然后就可以通过域名访问到你服务器上的网页文件。ip地址就相…

潇洒塑胶模具设计培训学校注塑模具设计培训课堂小知识

注塑模具胶口设计应遵循什么原则&#xff1f; 1、浇口应尽量开设在塑件截面最厚处&#xff0c;这样&#xff0c;浇口处冷却较慢&#xff0c;有利于熔料通过浇口往型腔中补料&#xff0c;故不易出现凹陷等缺陷。 2、浇口的位置应使熔料的流程最短、流向变化最小&#xff0c;能量…

东莞横沥潇洒职业培训学校丹丹老师分享避免因模具设计不良而使制品出现不均匀收缩

东莞横沥潇洒职业培训学校丹丹老师分享避免因模具设计不良而使制品出现不均匀收缩 设计精密注塑模时&#xff0c;如果模具结构或温度控制系统设计不当&#xff0c;容易使塑件出现收缩率不 均匀的现象&#xff0c;这种现象对塑件的精度以及塑件精度的稳定性均会产生不良影响。为…

Vue基础组件

本文章仅用作于个人学习笔记&#xff08;蓝后我就可以乱写啦&#xff09;复制代码 一、组件化的优点当TodoList的todo item越来越多的时候&#xff0c;我们应该把它拆分成一个组件进行开发&#xff0c;维护。组件的出现&#xff0c;就是为了拆分Vue实例的代码量&#xff0c;让我…