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\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
复位一下单片机,也可以不用
手机连接无线
这篇先写到这里,先让大家消化消化,其实AT指令看似简单,,其实很麻烦
下一篇连接