ESP8266—01s(与51单片机之间进行操作)

一.TCP协议

1.

TCP:"传输控制协议",是面向连接的,用来保证所有数据都能按顺序接收,如果没有TCP,则部分文件可能丢失或者无序,图像可能丢失或文本向后且无序,有了TCP,则如果发送途中第一个数据发送失败,则要求重新发送。

2.

TCP分为客户端和服务器,TCP客户端是通过TCP服务器的IP和端口号来连接TCP服务器的,TCP服务器用来侦听,只能客户端连接服务器,服务器不能连接客户端(图1见解流程);这个过程可以看成打电话,把客户端看成A,服务器看成B,A打电话时,B是不能打电话的,此时B只能接电话,连接以后就可以说话,也就是发送数据。

3

TCP 服务器=TCP server

TCP客户端=TCP client

图1

二.ESP8266介绍

上图是 esp8266—01s,黄色的是内存条,红圈这块是单片机,与51,32单片机不一样,它内置了WiFi功能,所以他可以和不同设备进行串行通信,单片机周围有许多的引脚但是没有引出来,因此就有了esp8266NodeMUC(下图),esp8266NodeMUC与esp8266—01s对比不但多了usb转ttl接口,还把单片机的引脚引了出来,因此可以直接接外设进行操作,无需接上其他单片机进行外设操作,本文主要讲esp8266—01s。

三.ESP8266初始设置

1.esp8266接线

USB转TLL的RXD和TXD分别接esp8266的TXD和RXD,3.3v接3.3v,GND接GND。

2.管脚说明

 

3.需要的app

安信可串口调试助手和网络调试助手,可以把安信可看做esp8266,因为这样连接以后发指令反馈都反馈到安信可的接收区,把网络调试助手看成电脑。

3.esp8266初始配置

1.esp8266上电以后出厂波特率是115200
2.打开安信可的串口,上电以后串口输出一串系统开机信息,购买的模块可能电压不稳定,导致乱码
3.上电以后发送指令AT,会返回OK,说明模块功能正常(要勾上发送新行,否则看不见OK标志)
4.想重启esp8266则发送AT+RST,返回ready,说明重启成功
5.想修改esp8266的波特率则发送AT+UART=9600,8,1,0,0(9600是波特率,8是数据为,1是停止位,两个0分别是校验位和流控)

三.ESP8266模式介绍

1.esp8266有两种模式,一种是station(设备模式),另一种是AP(路由器模式)。

2.设备模式就是相当于esp8266作为设备(手机)去联网,然后想让esp8266(安信可)发数据给电脑(网络调试助手),esp8266先发到联网的路由器上中转,再发送到电脑上(见解图2).

3.路由器模式就是相当于esp8266作为路由器,打开手机WiFi就可以看见一个没有密码的WiFi,正是esp8266发出的WiFi,,此时想让esp8266发数据给电脑,esp8266直接发给电脑,因为本身就是路由器不需要中转(见解图3)。

注意:无论是设备模式还是AP模式都要保证连接的WiFi一致,设备模式时,电脑连接路由器的WiFi,AP模式时电脑连接esp8266成为WiFi的WiFi!

指令返回
AT+CWMODE=1(设备模式)OK
AT+CWMODE=2(路由器模式)OK
AT+CWMODE=3(双模———设备模式/路由器模式)OK

四.ESP8266与TCP协议有什么关联?

1.TCP server 为 AP 模式,TCP client 为 station 模式。

2.网络调试助手(电脑)建立TCP server并设置端口号(下图),esp8266(安信可)为station模式时为TCP client,然后esp8266去连接电脑,此时esp8266为客户端,电脑作为服务器,此时电脑的ip地址为固定,esp8266发指令连接电脑服务器时,需要跟电脑的地址一致。电脑的地址win+r,输入cmd,输入ipconfig,无线局域网的IPV4地址就是电脑地址

3.esp8266为AP模式时,建立TCP server并设置端口号,电脑为TCP client(下图),电脑去连接esp8266,此时esp8266作为服务器,电脑作为客户端,此时esp8266的ip地址为固定,电脑连接服务器时需要esp8266的ip地址。

五.ESP8266作为客户端时入网设置,连接服务器及发送数据(设备模式)

串口透传技术:透传即透明传送,是指在数据传输过程中,通过无线的方式让这组数据不发生任何形式的改变,仿佛传输过程是透明一样,同时保证传输的质量,原封不动的传过去。

//设置esp8266为设备模式
AT+CWMODE=1

返回:OK


//esp8266以设备模式接入家中路由器配置
AT+CWJAP="WiFi名字",“密码”  
返回:WIFI CONNECTED
      WIFI GOT IP
      OK

//连接服务器,连接记得关闭防火墙,此时让esp8266连接的WiFi和电脑连接的WiFi一致才可以连接
AT+CIPSTART="TCP","电脑地址",端口号
配合上图AT+CIPSTART="TCP","192.168.10.9",8888

返回:CONNECT
      OK


//设置发送数据长度,返回>后,在>后输入数据则发送,这里输入的是abcd,此时发送完指令以后出现>,需要取消新行按钮,每次发送数据的时候都需要再次发送指令(勾选发送新行)。
AT+CIPSEND=4
返回:OK
     >abcd
     Respone:SEND OK


//由于这样很麻烦每次都需要发送一次指令,所以可以让esp8266开启透传模式就可以无限发送数据了
AT+CIPMODE=1
返回:Respone OK
在发送AT+CIPSEND
返回:Respone:>


//如果想退出透传模式则输入+++(取消新行按钮),点两下即退出透传模式



注:1.指令符号需要在英文状态下写,电脑地址可以win+r,输入cmd,输入ipconfig回车,无线局域网的IPv4就是电脑IP地址;2.设备模式连接路由器的WiFi必须是2.4GHZWIFI,只支持这个频率

六.ESP8266作为服务器时设置,建立服务器及发送数据(路由器模式)

//路由器模式,设置成路由器模式后,上电就能看见WiFi
AT+CWMODE=2
返回:Respone:OK


//设置esp8266可以多个用户连接(最多五个)或者只能一个用户连接
AT+CIPMUX=1(多连接)
AT+CIPMUX=0(单连接)
返回:Respone:OK


//查询地址,CIFSR:APIP是路由器esp8266的地址
AT+CIFSR
返回:+CIFSR:APIP,"地址"


//建立TCP server
AT+CIPSERVER=1(默认端口号333)或者AT+CIPSERVER=1,8888(端口号为8888)
返回:Respone:OK

//建立完TCP server以后,网络调试助手设置成TCP client,并输入APIP地址和输入端口号即可连接,此时电脑要连接esp8266当作路由器的WiFi,才能连接成功

//发送数据(esp8266发给电脑)
AT+CIPSEND=0,4(发送四个字节在0通道上) 
返回>abcd(输入数据)
返回:Respone:SEND OK

//接收数据(电脑发给esp8266)
+IPD,0,n:xxxxxxx (+IPD是固定字符串,0是通道,n是数据长度,xxxxxx是数据)


//断开连接
AT+CIPCLOSE=0
Respone:0,CLOSE OK 

七.ESP8266作为客户端与51单片机连接或作为服务器与51单片机连接

  图5为esp8266作为客户端与51单片机连接

 图6为esp8266作为服务器与51单片机连接

//esp8266作为客户端与单片机连接代码

#include <REGX52.H>
#include <INTRINS.H>
#include <string.h>

sbit AUXR=0x8E;
sbit switcher=P3^6;//继电器开关控制外接led亮灭
sbit led6=P2^5;
sbit led4=P2^3;

char buffer[2];
char AT_ok_flag=0;//设置WiFi模式返回的标志位
char LJmode[]="AT+CWMODE=1\r\n"; //设置成模式1,设备模式
code char LJwifi[]="AT+CWJAP=\"wifi名字\",\"wifi密码\"\r\n";//连接wifi
code char LJfwq[]="AT+CIPSTART=\"TCP\",\"192.168.10.9\",8888\r\n";//让wifi模块连接tcp服务器
char TCmode[]="AT+CIPMODE=1\r\n";//开启透传模式
char Senddata[]="AT+CIPSEND\r\n";//开始发送数据
char RESET[]="AT+RST\r\n";

void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void Uart_Init()
{
	SCON = 0x50;
	PCON &= 0x7F;
	AUXR = 0x01;
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFD;		//设定定时初值
	TH1 = 0xFD;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	ES  = 1;
	EA  = 1;
}

void Uart_Sendchar(unsigned char Char)
{
	SBUF=Char;
	while(TI==0);
	TI=0;
}

void Uart_Sendstring(unsigned char*string)
{
	while(*string!='\0')
	{
		Uart_Sendchar(*string);
		string++;
	}
}

void main()
{
	led6=1;//没连接服务器和没打开透传模式则灭灯
	//51单片机初始化
	Uart_Init();
	//让单片机发指令给WiFi模块进行设置
	Delay1000ms();
	Uart_Sendstring(LJmode);
	while(!AT_ok_flag);	
	AT_ok_flag=0;
	
	Uart_Sendstring(LJwifi);
	while(!AT_ok_flag);	
	AT_ok_flag=0;
	
	Uart_Sendstring(LJfwq);
	while(!AT_ok_flag);	
	AT_ok_flag=0;
	
	Uart_Sendstring(TCmode);
	while(!AT_ok_flag);
	AT_ok_flag=0;
	
	Uart_Sendstring(Senddata);
	while(!AT_ok_flag);
	
	
	if(AT_ok_flag)//连接wifi,服务器和打开透传模式则亮灯
	{
		led6=0;
	}
	while(1)
	{
			Delay1000ms();
			Uart_Sendstring("lqy\r\n");
	}
}

void Uart_Rountime() interrupt 4
{
	static int i=0;
	char temp;
	if(RI==1)
	{
		RI=0;
		temp=SBUF;
		if(temp=='O' ||temp=='F')//让ok的o始终保持在第一位
		{
			i=0;
		}
		buffer[i]=temp;
		i++;
		
		if(buffer[0]=='O'&& buffer[1]=='K')//连接成功
		{
			AT_ok_flag=1;
			memset(buffer,'\0',2);
		}
		if(buffer[0]=='F'&& buffer[1]=='A')//连接失败,重新连接
		{
			for(i=0;i<5;i++)
			{
				led4=0;
				Delay1000ms();
				led4=1;
				Delay1000ms();
			}
			Uart_Sendstring(RESET);
			memset(buffer,'\0',2);
		}
		if(buffer[0]=='p'||buffer[1]=='p')//输入p则亮灯
		{
			switcher=0;
			memset(buffer,'\0',2);
		}
		if(buffer[0]=='h'||buffer[1]=='h')//输入h则灭灯
		{
			switcher=1;
			memset(buffer,'\0',2);
		}
		if(i==2)
		{
			i=0;
			memset(buffer,'\0',2);
		}
	}
}
//esp8266作为服务器与单片机连接代码

#include <REGX52.H>
#include <INTRINS.H>
#include <string.h>

sbit AUXR=0x8E;
sbit switcher=P3^6;//继电器开关控制外接led亮灭
sbit led6=P2^5;
sbit led4=P2^3;

char buffer[3];
char AT_ok_flag=0;//设置WiFi模式返回的标志位
char AT_client_connect_flag=0;//客户端接入标志位
char LJmode[]="AT+CWMODE=2\r\n";//模式2,路由器模式
char DLJ[]="AT+CIPMUX=1\r\n";//开启多人连接模式
char LJFW[]="AT+CIPSERVER=1,8080\r\n";//建立服务器
char FSSJ[]="AT+CIPSEND=0,5\r\n";//发送数据

void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void Uart_Init()
{
	SCON = 0x50;
	PCON &= 0x7F;
	AUXR = 0x01;
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFD;		//设定定时初值
	TH1 = 0xFD;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	ES  = 1;
	EA  = 1;
}

void Uart_Sendchar(unsigned char Char)
{
	SBUF=Char;
	while(TI==0);
	TI=0;
}

void Uart_Sendstring(unsigned char*string)
{
	while(*string!='\0')
	{
		Uart_Sendchar(*string);
		string++;
	}
}

void main()
{
	led6=1;//没连接服务器和没打开透传模式则灭灯
	//51单片机初始化
	Uart_Init();
	//让单片机发指令给WiFi模块进行设置
	Delay1000ms();//上电不稳定
	Uart_Sendstring(LJmode);
	while(!AT_ok_flag);
	AT_ok_flag=0;
	
	Uart_Sendstring(DLJ);
	while(!AT_ok_flag);
	AT_ok_flag=0;
	
	Uart_Sendstring(LJFW);
	while(!AT_client_connect_flag);
	
	if(AT_client_connect_flag)
	{
		led6=0;
	}
	
	
	while(1)
	{
		Uart_Sendstring(FSSJ);//发送数据指令
		Delay1000ms();Delay1000ms();
		led4=0;
		Uart_Sendstring("hello");//单片机发给esp8266,然后在发给网络调试助手
		Delay1000ms();Delay1000ms();
		led4=1;
	}
}

void Uart_Rountime() interrupt 4
{
	static int i=0;
	char temp;
	if(RI==1)
	{
		RI=0;
		temp=SBUF;
		//让ok的o始终保持在第一位
		//0是连接服务器成功,返回让单片机知道连接成功,:是接收数据成功
		if(temp=='O' ||temp=='0' ||temp==':')
		{
			i=0;
		}
		buffer[i]=temp;
		i++;
		
		if(buffer[0]=='O'&& buffer[1]=='K')//连接成功
		{
			AT_ok_flag=1;
			memset(buffer,'\0',3);
		}
		if(buffer[0]=='0'&& buffer[2]=='C')//服务器连接成功
		{
			AT_client_connect_flag=1;
			memset(buffer,'\0',3);
		}

		if(buffer[0]==':'&& buffer[1]=='o'&& buffer[2]=='p')//输入open则开灯
		{
			switcher=0;
			memset(buffer,'\0',3);
		}
		if(buffer[0]==':'&& buffer[1]=='c'&& buffer[2]=='l')//输入close则灭灯
		{
			switcher=1;
			memset(buffer,'\0',3);
		}
		if(i==3)
		{
			i=0;
			memset(buffer,'\0',3);
		}
	}
}
补充指令
AT+RESTORE  //恢复出厂设置

//esp8266作为路由器进行设置密码,第一个x是代表通道号,第二个x代表加密方式

AT+CWSAP="wifi名字","wifi密码",x,x 

例如:AT+CWSAP="esp8266","123456789",5,4 

AT+CWMODE?  //查询esp8266模式

八.UDP协议

UDP是无连接的,与TCP对比少了连接,但是传输速度快,却不可靠,数据有可能丢失。

九.让ESP8266配置UDP数据传输(设备模式)

1.esp8266设置为设备模式

指令返回
AT+CWMODE=1OK

2.重启esp8266

指令返回
AT+RSTOK

3.连接路由器

指令返回
AT+CWJAP="WiFi名字","WiFi密码"OK

注意:连接的WiFi必须是2.4GHZWIFI

4.让网络调试助手设置成UDP协议,并输入电脑的地址(本地地址)和本地端口号(随便设置,不冲突即可)

5.让esp8266连接刚刚创建的UDP服务器

AT指令格式:UDP+远端IP+远端端口+本地端口

//远端的意思就是以自己为基点,对方就是远端,本地就是自己,这里的远端ip是刚刚网络调试助手的电脑地址和电脑的端口号,本地端口号随便设置。
指令返回
AT+CIPSTART="UDP","远端ip","远端端口","本地端口"CONNECT OK

6.开启透传模式

指令返回
AT+CIPMODE=1OK

7.发送数据

指令返回
AT+CIPSEND

OK

>

8.退出透传模

取消发送新行按钮,发送+++                                                                                                                                        

十.让ESP8266配置UDP数据传输(AP模式)

1.esp8266设置为AP模式

指令返回
AT+CWMODE=2OK

2.重启esp8266

指令返回
AT+RSTOK

3.让电脑连接esp8266作为路由器发出的WiFi,之后电脑地址改变了,win+r,输入cmd,输入ipconfig回车,无线局域网的IPv4 地址就是电脑此时的地址,然后打开网络调试助手输入电脑地址,还有端口号(随意设置),如果点击没反应退出app,重新进,在进行连接。

4.让esp8266连接刚刚创建的UDP服务器

AT指令格式:UDP+远端IP+远端端口+本地端口

//远端的意思就是以自己为基点,对方就是远端,本地就是自己,这里的远端ip是刚刚网络调试助手的电脑地址和电脑的端口号,本地端口号随便设置。
指令返回
AT+CIPSTART="UDP","远端ip","远端端口","本地端口"CONNECT OK

5.开启透传模式

指令返回
AT+CIPMODE=1OK

6.发送数据

指令返回
AT+CIPSEND

OK

>

7.退出透传模

取消发送新行按钮,发送+++                                                                                                                                        

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值