单片通过ESP8266WiFi模块进行通讯

一.AT指令介绍

1.1:AT指令含义

AT指令是应用于设备与PC应用之间的连接与通信的指令。AT 即Attention。每个AT命令行中只能包含一条AT指令;对于AT指令的发送,除AT两个字符外,最多可以接收1056个字符的长度(包括最后的空字符)。

注意:1.AT控制类指令都是需要加回车的,数据传输时不需要加回车

2.ESP-01S出厂的波特率是115200

3.由于开始上电的时候电压可能会出现不太稳定的情况,因此才开始进行测试的时候,可能会有乱码的情况发生

1.2:AT指令具体含义介绍

通用配置指令

1.2.1:AT指令

作用:用于测试AT是否OK

返回值:OK--表示AT是OK的

1.2.2:AT+RST指令

作用:软重启模组

返回值:OK--表示软重启成功

设备入网指令

1.2.3:AT+CWMODE

作用:用于配置工作模式

返回值--1:设备模式;2:路由模式;3--双模

1.2.4:AT+CWJAP

作用:用于将设备连接到路由器上

设定方式:AT+CWJAP = "路由器的SSID名称","SSID的密码"

返回值:WiFi CONNECT

WIFI GOT IP

1.2.5:AT+CIFSR

作用:用于查询IP地址

设定方式:AT+CIFSR

返回值:+CIFSR:APIP,"192.168.4.1"
              +CIFSR:APMAC,"a2:20:a6:19:c7:0a"

连接到TCP服务器

1.2.6:AT+CIPSTART

作用:连接到服务器端

设定方式:AT+CIPSTART="TCP","服务器端地址",服务器端口号

1.2.7:AT+CIPSEND

作用:用于设定发送数据的长度

设定方式:AT+CIPSEND=4  (含义:设定发送数据长度为4个字节)

返回值:response send ok

1.2.8:AT+CIPMODE

作用:用于设定传送模式

设定方式:AT+CIPMODE=1   (含义:开启透传模式)

返回值:OK

二.通过单片机实现上述功能

1.通过网络控制单片机指示灯

#include <REGX51.H>
#include "intrins.h"
#include <string.h>

#define SIZE 12
sfr AUXR = 0x8E;
sbit LED = P3^7;
char cmd[SIZE];
code char link_network[]="AT+CWJAP=\"TP-LINK_3E30\",\"18650711783\"\r\n";
code char link_server[]="AT+CIPSTART=\"TCP\",\"192.168.0.113\",8880\r\n"; 
code char mode_TC[]="AT+CIPMODE=1\r\n";
code char send_datas[]  = "AT+CIPSEND\r\n";

void UartInit(void)		//9600bps@11.0592MHz
{
	AUXR = 0x01;
	SCON = 0x50; //配置串口工作方式1,REN使能接收
	TMOD &= 0x0F;
	TMOD |= 0x20;//定时器1工作方式位8位自动重装
	
	TH1 = 0xFD;
	TL1 = 0xFD;//9600波特率的初值
	TR1 = 1;//启动定时器
	
	EA = 1;//开启总中断
	ES = 1;//开启串口中断
}
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 sendbyte(char_data)
{
	SBUF = char_data;
	while(!TI);
	TI = 0;
}
void sendstring(char* string)
{
	while(*str != '\0')
	{
		sendbyte(*string);
		string++;
	}
}
/*为了保证发送一次AT指令,定义Mark标志位,如果Mark=0,则指令AT指令发送,否则不会发送AT指令*/
void mian()
{
	int mark = 0;
	UartInit();
	if(mark == 0)
	{
		sendstring(link_network);
		Delay1000ms();
		Delay1000ms();
		Delay1000ms();
		sendstring(link_server);	
		Delay1000ms();
		Delay1000ms();
		Delay1000ms();
		sendstring(mode_TC);
		Delay1000ms();
		Delay1000ms();
		Delay1000ms();
		sendstring(send_datas);
	}
	else
	{
		sendstring("you are handsome");
	}
}
/*当接收到数字‘1’时,指示灯点亮,当接收到数字"0"时,指示灯熄灭*/
void uart_handler()   interrupt  4
{
	if(RI)
	{
		RI = 0;
		cmd[0] = SBUF;
		if(cmd[0] == '1')
		{
			LED = 0;
		}
		if(cmd[0] == '0')
		{
			LED = 1;
		}
	}
	 if(TI)
}

2.优化8266的使用方式,检测AT指令结果

由于在上面的代码中,各个指令通过延时的方式来执行,但是有的时候会出现指令执行失败的情况,这时如果执行后面的指令就是无效的,因此需要监控每一条指令的执行结果

#include "reg52.h"
#include "intrins.h"
#include <string.h>


#define SIZE 12
sfr AUXR = 0x8E;
sbit LED1 = P3^0;
sbit LED2 = P3^1;
sbit LED3 = P3^2;
																		   
char buffer [SIZE];														   
code char link_network[]="AT+CWJAP=\"TP-LINK_3E30\",\"18650711783\"\r\n";   //入网指令
code char link_server[]="AT+CIPSTART=\"TCP\",\"192.168.0.113\",8880\r\n";  	//连接服务器指令
code char mode_TC[]="AT+CIPMODE=1\r\n";									    //透传指令
code char send_datas[]  = "AT+CIPSEND\r\n";									//开始发送数据
char RESET[] = "AT+RST\r\n";											    //重新启动模块

char AT_OK_FLAG = 0;
char AT_LINK_FLAG = 0;
void UartInit()		//9600bps@11.0592MHz
{
	AUXR = 0x01;
	SCON = 0x50; //配置串口工作方式1,REN使能接收
	TMOD &= 0x0F;
	TMOD |= 0x20;//定时器1工作方式位8位自动重装
	
	TH1 = 0xFD;
	TL1 = 0xFD;//9600波特率的初值
	TR1 = 1;//启动定时器
	
	EA = 1;//开启总中断
	ES = 1;//开启串口中断
}
void sendByte(char data_msg)
{
	SBUF = data_msg;
	while(!TI);
	TI = 0;
}

void sendString(char* str)
{
	while( *str != '\0'){
		sendByte(*str);
		str++;
	}
}

void main()
{
	int mark = 0;
	LED = 1;
	UartInit();
	sendString(link_network);
	while(!AT_OK_FLAG);
	AT_OK_FLAG = 0;
	sendString(link_server);
	while(!AT_OK_FLAG);
	AT_OK_FLAG = 0;
	sendString(mode_TC);
	while(!AT_OK_FLAG);
	AT_OK_FLAG = 0;
	sendString(send_datas);
	while(!AT_OK_FLAG);
	AT_OK_FLAG = 0;
	if(AT_LINK_FLAG)
	{
		LED2 = 0;
	}
}

void Uart_Handler() interrupt 4
{
	static int i = 0;//静态变量,被初始化一次,定义下标
	char tmp;
	if(RI)
	{
		RI = 0;
		tep = SBUF;
		if(tep == 'W' || tep == 'O' || tep == 'L'  || tep == 'F')  //检测接收接收到的数据中的特定字符,如果接收到上面的字符,则将下标自动移动到第一位
		{
			i = 0;
		}
		buffer[i] = tep;
		i++;
	//入网成功的判断依据WIFI GOT IP
	if(buffer[0] == 'W' && buffer[5] == 'G')
	{
		 AT_LINK_FLAG = 1;
		 memset(buffer,'\0',SIZE);
	}
	//连接服务器等OK返回值指令的判断
	if(buffer[0] == 'O' && buffer[1] == 'K')
	{
		 AT_OK_Flag	= 1;
		 memset(buffer, '\0', SIZE);
	}
	//联网失败出现FAIL字样捕获
	if(buffer[0] == 'F' && buffer[1] == 'A')
	{
		for(i=0;i<5;i++)
		{
			LED1 = 0;
			Delay1000ms();
			LED1 = 1;
			Delay1000ms();
		}
		sendString(RESET);
		memset(buffer, '\0', SIZE);
	}
	 	if(i == 12) i = 0;
	}
}

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值