AT指令集是从终端设备(Terminal Equipment,TE)或数据终端设备(Data Terminal Equipment,DTE)向终端适配器(Terminal Adapter,TA)或数据电路终端设备(Data Circuit Terminal Equipment,DCE)发送的。 其对所传输的数据包大小有定义:即对于AT指令的发送,除AT两个字符外,最多可以接收1056个 字符的长度(包括最后的空字符)。 每个AT命令行中只能包含一条AT指令;对于由终端设备主动向PC端报告的URC指示或者response 响应,也要求一行最多有一个,不允许上报的一行中有多条指示或者响应。AT指令以回车作为结 尾,响应或上报以回车换行为结尾。
ESP-01s出厂波特率正常是115200, 注意:AT指令,控制类都要加回车,数据传输时不加回车
上电后,通过串口输出一串系统开机信息,购买的部分模块可能电压不稳,导致乱码,以 ready 为准
################################################
arch:ESP8266, 1
compile_time:Ai-Thinker|B&T
wifi_mac:4c75250dAE2F
sdk_version:v3.4-22-g967752e2
firmware_version:2.2.0
compile_time:Jun 30 2021 11:28:20
ready
################################################
AT Response : OK |
上电后发送AT指令测试通信及模块功能是否正常 |
AT+RST | 重启 |
AT+UART=9600,8,1,0,0 | 设置波特率 |
AT+CWMODE=1 Response : OK |
设置工作模式 1. 是station(设备)模式 2.是AP(路由)模式 3.是双模 |
AT+CIFSR |
查询IP地址 |
AT+CWJAP="WiFi用户名","WiFi密码" Response :WIFI CONNECTED Response :WIFI GOT IP |
以设备模式接入家用路由器配置 |
AT+CIFSR Response : +CIFSR:APIP,"192.168.4.1" +CIFSR:APMAC,"4e:75:25:0d:ae:2f" +CIFSR:STAIP,"192.168.0.148" +CIFSR:STAMAC,"4c:75:25:0d:ae:2f" |
查询IP地址 |
AT+CIPSTART="TCP","192.168.101.162",8880 Response :OK |
连接到 TCP server |
AT+CIPSEND=4 | 设置即将发送数据的长度 (这里是4个字节) |
AT+CIPMODE=1 Response : OK |
开启透传模式(+++退出透传) |
AT+CIPSEND Response : OK |
随意发送接收数据 |
AT+CIPMUX=1 Response : OK |
使能多链接 |
AT+CIPSERVER=1 Response : OK |
建立TCPServer,default port = 333 |
AT+CIPSEND=0,4 >abcd //输入数据,不带回车 Response : SEND OK |
发送4个字节在连接0通道上 |
AT+CIPCLOSE=0 Response : 0 , CLOSED OK |
断开连接 |
1、初始配置和验证
AT指令 | 功能 | 回复 |
AT | 上电后发送AT指令测试通信及模块功能是否正常 | OK |
AT+UART=9600,8,1,0,0 | 通过一下命令配置成9600波特率 | |
AT+CWMODE=3 | 1. 是station(设备)模式 2.是AP(路由)模式 3.是双模 | OK |
AT+CWJAP="WiFi用户名","WiFi密码" | 以设备模式接入家中路由器配置 | WIFI CONNECTED WIFI GOT IP |
AT+CIFSR | 查询IP地址 | 一系列IP信息 OK |
2、连接到 TCP server
1. 开关网络助手,设立TCP服务器(ESP-01S和主机要在同一wifi网络下)
2. 连接服务器
AT指令 功能 回复 AT+CIPSTART="TCP","192.168.0.113",8888 连接服务器 CONNECT 成功
OK 成功
3. 发送数据
AT+CIPSEND=4 // 设置即将发送数据的长度 (这里是4个字节)
>ZYFA // 看到大于号后,输入消息,ZYFA,不要带回车
Response :SEND OK //结果:成功
//注意,这种情况下,每次发送前都要先发送AT+CIPSEND=长度 的指令,再发数据!
4、透传模式
上面每次发送数据都要进行字符长度设定,如果设置成透传,就有点像蓝牙模块的玩法
上面 的第2步之后
4.1、AT+CIPMODE=1 //开启透传模式
Response :OK
4.2、AT+CIPSEND //带回车
Response: > //这个时候随意发送接收数据咯
4.3、退出透传模式
在透传发送数据过程中,若识别到单独的⼀包数据 “+++”,则退出透传发送
3、用51单片机帮你实现这一切
#include
#include
#include
#define SIZE 12
sfr AUXR=0x8E;
sbit led1=P3^7;
sbit led2=P3^6;
char buffer[SIZE];
code char LJWL[]="AT+CWJAP=\"TP-LINK_1150\",\"yanfeng7518\"\r\n";//连接网络,双引号为转译
code char LJFWQ[]="AT+CIPSTART=\"TCP\",\"192.168.101.116\",8880\r\n";//连接服务器
char TCMS[]="AT+CIPMODE=1\r\n";//透传模式指令
char SJCS[]="AT+CIPSEND\r\n";//数据传输开始指令
char AT_OK_Flag=0;
char AT_Connect_Net_Flag=0;
void UartInit(void) //[email protected]
{
AUXR=0x01;
SCON=0x50;//8位数据,可变波特率 REN置1
TMOD &= 0x0F;//定时器时钟为12T
TMOD |= 0x20;//串口1选择定时器1为波特率发生器
TH1=0xFD;//设定定时初值
TL1=0xFD;//波特率为9600
TR1=1;//启动定时器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_msg)
{
SBUF=data_msg;
while(!TI);//TI为发送中断请求位
TI=0;
}
void sendString(char *str)
{
while(*str!='\0'){
sendByte(*str);
str++;
}
}
void main()
{
int mark=0;
led1=1;
led2=1;
UartInit();//串口初始化
Delay1000ms();//给WiFi上电时间
sendString(LJWL);
while(!AT_Connect_Net_Flag);//WIFI GOT IP返回值的标志位
while(!AT_OK_Flag); //OK返回值的标志位
AT_OK_Flag=0;
sendString(LJFWQ);
while(!AT_OK_Flag);
AT_OK_Flag=0;
sendString(TCMS);
while(!AT_OK_Flag);
AT_OK_Flag=0;
sendString(SJCS);
while(!AT_OK_Flag);
if(AT_Connect_Net_Flag){
led1=0;//点亮LED1灯,代表入网成功
}
if(AT_OK_Flag){
led2=0;//点亮LED2灯,代表连接服务器并打开透传模式成功
}
while(1){
Delay1000ms();
sendString("zhengyanfeng handsome\r\n");
}
}
void Uart_handle() interrupt 4
{
static int i=0;//静态变量,初始化1次
char tmp;
if(RI){ //中断函数中对接收中断的响应
RI=0; //RI为接受中断数据标志位,接收完数据硬件置1,需要软件置0
tmp=SBUF;
if(tmp=='W'||tmp=='O'||tmp=='L'){
i=0;//强制W字符为第一位
}
buffer[i++]=tmp;//数据偏移
if(buffer[0]=='W' && buffer[5]=='G'){ //入网成功的判断依据WIFI GOT IP
AT_Connect_Net_Flag=1;
memset(buffer,'\0',SIZE);
}
if(buffer[0]=='O' && buffer[1]=='K'){ //连接服务器等OK返回值指令的判断
AT_OK_Flag=1;
memset(buffer,'\0',SIZE);
}
if(buffer[0]=='L' && buffer[2]=='1'){ //strstr(str1,str2)判断str1里面是不是有str2
led1=0;
memset(buffer,'\0',SIZE);
}
if(buffer[0]=='L' && buffer[2]=='0'){
led1=1;
memset(buffer,'\0',SIZE);
}
if(i==12) i=0;
}
}
USB转TTL插入电脑,TX--RX RX-TX VCC-3.3V GDN-GND
查询IP地址:AT+CIFSR
1、配置成路由模式
AT+CWMODE=2
Response :OK
2、使能多链接
AT+CIPMUX=1
Response :OK
3、建立TCPServer
AT+CIPSERVER=1 // default port = 333
Response :OK
4、发送数据
AT+CIPSEND=0,4 // 发送4个字节在连接0通道上
>abcd //输入数据,不带回车
Response :SEND OK
5、接收数据
+IPD, 0, n: xxxxxxxxxx //+IPD是固定字符串 0是通道,n是数据长度,xxx是数
6、断开连接 AT+CIPCLOSE=0
Response :0, CLOSED OK
#include
#include
#include
#define SIZE 12
sfr AUXR=0x8E;
sbit led1=P3^7;
sbit led2=P3^6;
char buffer[SIZE];
char LYMO[]="AT+CWMODE=2\r\n";//1.工作在路由模式
char DLJ[]="AT+CIPMUX=1\r\n";//2.使能多连接
char JLFW[]="AT+CIPSERVER=1\r\n";//3.建立服务器 default port=333
char FSSJ[]="AT+CIPSEND=0,5\r\n";//4.发送数据
char AT_OK_Flag=0;
char AT_Connect_Net_Flag=0;
char Client_Connect_Flag=0;
void UartInit(void) //[email protected]
{
AUXR=0x01;
SCON=0x50;//8位数据,可变波特率 REN置1
TMOD &= 0x0F;//定时器时钟为12T
TMOD |= 0x20;//串口1选择定时器1为波特率发生器
TH1=0xFD;//设定定时初值
TL1=0xFD;//波特率为9600
TR1=1;//启动定时器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_msg)
{
SBUF=data_msg;
while(!TI);//TI为发送中断请求位
TI=0;
}
void sendString(char *str)
{
while(*str!='\0'){
sendByte(*str);
str++;
}
}
void main()
{
int mark=0;
led1=1;
led2=1;
UartInit();//串口初始化
Delay1000ms();//给WiFi上电时间
sendString(LYMO);
while(!AT_OK_Flag);
AT_OK_Flag=0;
sendString(DLJ);
while(!AT_OK_Flag);
AT_OK_Flag=0;
sendString(JLFW);
while(!Client_Connect_Flag);
if(Client_Connect_Flag){
AT_OK_Flag=0;
led1=0;
led2=0;
}
while(1){
sendString(FSSJ);
Delay1000ms();
Delay1000ms();
sendString("Hello");
Delay1000ms();
Delay1000ms();
}
}
void Uart_handle() interrupt 4
{
static int i=0;//静态变量,初始化1次
char tmp;
if(RI){ //中断函数中对接收中断的响应
RI=0; //RI为接受中断数据标志位,接收完数据硬件置1,需要软件置0
tmp=SBUF;
if(tmp=='W'||tmp=='O'||tmp=='L'||tmp=='0'||tmp==':'){
i=0;
}
buffer[i++]=tmp;
if(buffer[0]=='W' && buffer[5]=='G'){
AT_Connect_Net_Flag=1;
memset(buffer,'\0',SIZE);
}
if(buffer[0]=='O' && buffer[1]=='K'){
AT_OK_Flag=1;
memset(buffer,'\0',SIZE);
}
if(buffer[0]=='0' && buffer[2]=='C'){
Client_Connect_Flag=1;
memset(buffer,'\0',SIZE);
}
if(buffer[0]==':' && buffer[1]=='o'&& buffer[2]=='p'){
led1=0;
memset(buffer,'\0',SIZE);
}
if(buffer[0]==':' && buffer[1]=='c'&& buffer[2]=='l'){
led1=1;
memset(buffer,'\0',SIZE);
}
if(i==12) i=0;
}
}
ESP8266网络调试手段:
1、刚开始可以通过TTL转USB直接和ESP8266连接,通过电脑安信可软件实现手动发送AT指令,观察ESP8266的返回值信息。
2、白盒测试:第一种调试手段比较蠢,我们需要手段发送AT指令,此时我们就需要通过51单片机来帮我们做这部分事,我们可以把单片机的TXD接到ESP8266的RXD,ESP8266的TXD再接到TTL转USB的RXD,这样我们就可以看到代码运行是否正确,在哪个环节出现问题。
3、ESP8266直接与51单片机交互,单片机的TXD接到ESP8266的RXD,ESP8266的TXD再接到
单片机的RXD,单片机把AT指令发送给ESP8266,让ESP8266可以上网,此时我们就可以通过网络调试助手发送指令实现WiFi模块对单片机IO口的操作。