一.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;
}
}