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

简介: http://www.cnblogs.com/yangfengwu/p/8759294.html  如不做任何说明默认最头上的链接为上一篇链接,末尾的链接为下一篇链接  先把源码和资料链接放到这里   链接:https://pan.

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

目录
相关文章
|
8月前
|
JavaScript 数据可视化 Docker
简易制作MCP服务器并测试
本文介绍了如何简易制作并测试MCP服务器,包括环境搭建、代码实现及Docker部署。首先通过uv包创建项目,在main.py中定义MCP服务器及其工具和资源函数。接着详细说明了在Windows上安装uv、配置Docker镜像加速、生成requirements.txt文件以及编写Dockerfile的过程。最后,通过构建和运行Docker容器部署MCP服务器,并使用Node.js工具测试其功能,确保服务器正常工作。此教程适合初学者快速上手MCP服务器的开发与部署。
3124 63
|
运维 Prometheus 监控
如何在测试环境中保持操作系统、浏览器版本和服务器配置的稳定性和一致性?
如何在测试环境中保持操作系统、浏览器版本和服务器配置的稳定性和一致性?
|
缓存 Ubuntu Linux
Linux环境下测试服务器的DDR5内存性能
通过使用 `memtester`和 `sysbench`等工具,可以有效地测试Linux环境下服务器的DDR5内存性能。这些工具不仅可以评估内存的读写速度,还可以检测内存中的潜在问题,帮助确保系统的稳定性和性能。通过合理配置和使用这些工具,系统管理员可以深入了解服务器内存的性能状况,为系统优化提供数据支持。
952 4
|
弹性计算 Shell Windows
阿里云学生专享ecs服务器体验及个人配置
阿里云学生优惠专享的云服务器个人使用体验
阿里云学生专享ecs服务器体验及个人配置
|
2月前
|
弹性计算 运维 安全
阿里云轻量应用服务器与云服务器ECS啥区别?新手帮助教程
阿里云轻量应用服务器适合个人开发者搭建博客、测试环境等低流量场景,操作简单、成本低;ECS适用于企业级高负载业务,功能强大、灵活可扩展。二者在性能、网络、镜像及运维管理上差异显著,用户应根据实际需求选择。
273 10
|
2月前
|
运维 安全 Ubuntu
阿里云渠道商:服务器操作系统怎么选?
阿里云提供丰富操作系统镜像,涵盖Windows与主流Linux发行版。选型需综合技术兼容性、运维成本、安全稳定等因素。推荐Alibaba Cloud Linux、Ubuntu等用于Web与容器场景,Windows Server支撑.NET应用。建议优先选用LTS版本并进行测试验证,通过标准化镜像管理提升部署效率与一致性。
|
2月前
|
弹性计算 ice
阿里云4核8g服务器多少钱一年?1个月和1小时价格,省钱购买方法分享
阿里云4核8G服务器价格因实例类型而异,经济型e实例约159元/月,计算型c9i约371元/月,按小时计费最低0.45元。实际购买享折扣,1年最高可省至1578元,附主流ECS实例及CPU型号参考。
415 8
|
2月前
|
存储 监控 安全
阿里云渠道商:云服务器价格有什么变动?
阿里云带宽与存储费用呈基础资源降价、增值服务差异化趋势。企业应结合业务特点,通过阶梯计价、智能分层、弹性带宽等策略优化成本,借助云监控与预算预警机制,实现高效、可控的云资源管理。
|
2月前
|
弹性计算 运维 安全
区别及选择指南:阿里云轻量应用服务器与ECS云服务器有什么区别?
阿里云轻量应用服务器适合个人开发者、学生搭建博客、测试环境,易用且性价比高;ECS功能更强大,适合企业级应用如大数据、高流量网站。根据需求选择:轻量入门首选,ECS专业之选。
261 2
|
2月前
|
弹性计算 ice
阿里云4核8G云服务器配置价格:热门ECS实例及CPU处理器型号说明
阿里云2025年4核8G服务器配置价格汇总,涵盖经济型e实例、计算型c9i等热门ECS实例,CPU含Intel Xeon及AMD EPYC系列,月费159元起,年付低至1578元,按小时计费0.45元起,实际购买享折扣优惠。
525 1