前言:
藍(lán)牙,ESP-01s,Zigbee, NB-Iot等通信模塊都是基于AT指令的設(shè)計(jì)
?一、AT指令
AT指令集是從終端設(shè)備(Terminal Equipment,TE)或數(shù)據(jù)終端設(shè)備(Data Terminal Equipment,DTE)向終端適配器(Terminal Adapter,TA)或數(shù)據(jù)電路終端設(shè)備(Data Circuit Terminal Equipment,DCE)發(fā)送的。 其對(duì)所傳輸?shù)臄?shù)據(jù)包大小有定義:即對(duì)于AT指令的發(fā)送,除AT兩個(gè)字符外,最多可以接收1056個(gè) 字符的長(zhǎng)度(包括最后的空字符)。 每個(gè)AT命令行中只能包含一條AT指令;對(duì)于由終端設(shè)備主動(dòng)向PC端報(bào)告的URC指示或者response 響應(yīng),也要求一行最多有一個(gè),不允許上報(bào)的一行中有多條指示或者響應(yīng)。AT指令以回車作為結(jié) 尾,響應(yīng)或上報(bào)以回車換行為結(jié)尾。
-
初始配置和驗(yàn)證
ESP-01s出廠波特率正常是115200, 注意:AT指令,控制類都要加回車,數(shù)據(jù)傳輸時(shí)不加回車
上電后,通過(guò)串口輸出一串系統(tǒng)開(kāi)機(jī)信息,購(gòu)買的部分模塊可能電壓不穩(wěn),導(dǎo)致亂碼,以 ready 為準(zhǔn)
################################################
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指令
AT Response?:?OK |
上電后發(fā)送AT指令測(cè)試通信及模塊功能是否正常 |
AT+RST | 重啟 |
AT+UART=9600,8,1,0,0 | 設(shè)置波特率 |
AT+CWMODE=1 Response?:?OK |
設(shè)置工作模式 1. 是station(設(shè)備)模式? 2.是AP(路由)模式? 3.是雙模 |
AT+CIFSR |
查詢IP地址 |
AT+CWJAP="WiFi用戶名","WiFi密碼" Response?:WIFI CONNECTED? Response?:WIFI GOT IP? |
以設(shè)備模式接入家用路由器配置 |
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 | 設(shè)置即將發(fā)送數(shù)據(jù)的長(zhǎng)度 (這里是4個(gè)字節(jié)) |
AT+CIPMODE=1 Response?:?OK |
開(kāi)啟透?jìng)髂J剑?++退出透?jìng)鳎?/td> |
AT+CIPSEND Response?:?OK |
隨意發(fā)送接收數(shù)據(jù) |
AT+CIPMUX=1 Response?:?OK |
使能多鏈接 |
AT+CIPSERVER=1 Response?:?OK |
建立TCPServer,default port = 333 |
AT+CIPSEND=0,4 >abcd //輸入數(shù)據(jù),不帶回車 Response?:?SEND OK |
發(fā)送4個(gè)字節(jié)在連接0通道上 |
AT+CIPCLOSE=0 Response?:?0?,?CLOSED OK |
斷開(kāi)連接 |
二、station(設(shè)備)模式連接到 TCP server
1、初始配置和驗(yàn)證
AT指令 | 功能 | 回復(fù) |
AT | 上電后發(fā)送AT指令測(cè)試通信及模塊功能是否正常 | OK |
AT+UART=9600,8,1,0,0 | 通過(guò)一下命令配置成9600波特率 | |
AT+CWMODE=3? | 1. 是station(設(shè)備)模式 2.是AP(路由)模式 3.是雙模 | OK |
AT+CWJAP="WiFi用戶名","WiFi密碼"? | 以設(shè)備模式接入家中路由器配置 | WIFI CONNECTED? WIFI GOT IP? |
AT+CIFSR? | 查詢IP地址 | 一系列IP信息 OK |
2、連接到 TCP server
1. 開(kāi)關(guān)網(wǎng)絡(luò)助手,設(shè)立TCP服務(wù)器(ESP-01S和主機(jī)要在同一wifi網(wǎng)絡(luò)下)
?2. 連接服務(wù)器
AT指令 功能 回復(fù) AT+CIPSTART="TCP","192.168.0.113",8888 連接服務(wù)器 CONNECT 成功
OK? ?成功
3. 發(fā)送數(shù)據(jù)
AT+CIPSEND=4? ? ? ? ? ?// 設(shè)置即將發(fā)送數(shù)據(jù)的長(zhǎng)度 (這里是4個(gè)字節(jié))
>ZYFA? ? ? ? ? ? ? ? ? ? ? ? ?// 看到大于號(hào)后,輸入消息,ZYFA,不要帶回車
Response :SEND OK //結(jié)果:成功
//注意,這種情況下,每次發(fā)送前都要先發(fā)送AT+CIPSEND=長(zhǎng)度 的指令,再發(fā)數(shù)據(jù)!
4、透?jìng)髂J?/p>
上面每次發(fā)送數(shù)據(jù)都要進(jìn)行字符長(zhǎng)度設(shè)定,如果設(shè)置成透?jìng)?,就有點(diǎn)像藍(lán)牙模塊的玩法
上面 的第2步之后
4.1、AT+CIPMODE=1 //開(kāi)啟透?jìng)髂J?/p>
Response :OK
4.2、AT+CIPSEND? ? ? //帶回車
Response: >? ? ? ? ? ? ? ? //這個(gè)時(shí)候隨意發(fā)送接收數(shù)據(jù)咯
4.3、退出透?jìng)髂J?/p>
在透?jìng)靼l(fā)送數(shù)據(jù)過(guò)程中,若識(shí)別到單獨(dú)的?包數(shù)據(jù) “+++”,則退出透?jìng)靼l(fā)送
3、用51單片機(jī)幫你實(shí)現(xiàn)這一切
#include <reg52.h>
#include <intrins.h>
#include <string.h>
#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";//連接網(wǎng)絡(luò),雙引號(hào)為轉(zhuǎn)譯
code char LJFWQ[]="AT+CIPSTART=\"TCP\",\"192.168.101.116\",8880\r\n";//連接服務(wù)器
char TCMS[]="AT+CIPMODE=1\r\n";//透?jìng)髂J街噶?char SJCS[]="AT+CIPSEND\r\n";//數(shù)據(jù)傳輸開(kāi)始指令
char AT_OK_Flag=0;
char AT_Connect_Net_Flag=0;
void UartInit(void) //9600bps@11.0592MHz
{
AUXR=0x01;
SCON=0x50;//8位數(shù)據(jù),可變波特率 REN置1
TMOD &= 0x0F;//定時(shí)器時(shí)鐘為12T
TMOD |= 0x20;//串口1選擇定時(shí)器1為波特率發(fā)生器
TH1=0xFD;//設(shè)定定時(shí)初值
TL1=0xFD;//波特率為9600
TR1=1;//啟動(dòng)定時(shí)器1
EA=1;//開(kāi)啟總中斷
ES=1;//開(kāi)啟串口中斷
}
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為發(fā)送中斷請(qǐng)求位
TI=0;
}
void sendString(char *str)
{
while(*str!='\0'){
sendByte(*str);
str++;
}
}
void main()
{
int mark=0;
led1=1;
led2=1;
UartInit();//串口初始化
Delay1000ms();//給WiFi上電時(shí)間
sendString(LJWL);
while(!AT_Connect_Net_Flag);//WIFI GOT IP返回值的標(biāo)志位
while(!AT_OK_Flag); //OK返回值的標(biāo)志位
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;//點(diǎn)亮LED1燈,代表入網(wǎng)成功
}
if(AT_OK_Flag){
led2=0;//點(diǎn)亮LED2燈,代表連接服務(wù)器并打開(kāi)透?jìng)髂J匠晒? }
while(1){
Delay1000ms();
sendString("zhengyanfeng handsome\r\n");
}
}
void Uart_handle() interrupt 4
{
static int i=0;//靜態(tài)變量,初始化1次
char tmp;
if(RI){ //中斷函數(shù)中對(duì)接收中斷的響應(yīng)
RI=0; //RI為接受中斷數(shù)據(jù)標(biāo)志位,接收完數(shù)據(jù)硬件置1,需要軟件置0
tmp=SBUF;
if(tmp=='W'||tmp=='O'||tmp=='L'){
i=0;//強(qiáng)制W字符為第一位
}
buffer[i++]=tmp;//數(shù)據(jù)偏移
if(buffer[0]=='W' && buffer[5]=='G'){ //入網(wǎng)成功的判斷依據(jù)WIFI GOT IP
AT_Connect_Net_Flag=1;
memset(buffer,'\0',SIZE);
}
if(buffer[0]=='O' && buffer[1]=='K'){ //連接服務(wù)器等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;
}
}
三、ESP-01s當(dāng)服務(wù)器
1、AP模式配置
USB轉(zhuǎn)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、發(fā)送數(shù)據(jù)
AT+CIPSEND=0,4? ? // 發(fā)送4個(gè)字節(jié)在連接0通道上
>abcd? ? ? ? ? ? ? ? ? ? ? ? //輸入數(shù)據(jù),不帶回車
Response :SEND OK
5、接收數(shù)據(jù)
+IPD, 0, n: xxxxxxxxxx? ? ? ? ? //+IPD是固定字符串 0是通道,n是數(shù)據(jù)長(zhǎng)度,xxx是數(shù)
6、斷開(kāi)連接 AT+CIPCLOSE=0
Response :0, CLOSED OK
2、單片機(jī)幫你做這一切
#include <reg52.h>
#include <intrins.h>
#include <string.h>
#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.建立服務(wù)器 default port=333
char FSSJ[]="AT+CIPSEND=0,5\r\n";//4.發(fā)送數(shù)據(jù)
char AT_OK_Flag=0;
char AT_Connect_Net_Flag=0;
char Client_Connect_Flag=0;
void UartInit(void) //9600bps@11.0592MHz
{
AUXR=0x01;
SCON=0x50;//8位數(shù)據(jù),可變波特率 REN置1
TMOD &= 0x0F;//定時(shí)器時(shí)鐘為12T
TMOD |= 0x20;//串口1選擇定時(shí)器1為波特率發(fā)生器
TH1=0xFD;//設(shè)定定時(shí)初值
TL1=0xFD;//波特率為9600
TR1=1;//啟動(dòng)定時(shí)器1
EA=1;//開(kāi)啟總中斷
ES=1;//開(kāi)啟串口中斷
}
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為發(fā)送中斷請(qǐng)求位
TI=0;
}
void sendString(char *str)
{
while(*str!='\0'){
sendByte(*str);
str++;
}
}
void main()
{
int mark=0;
led1=1;
led2=1;
UartInit();//串口初始化
Delay1000ms();//給WiFi上電時(shí)間
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;//靜態(tài)變量,初始化1次
char tmp;
if(RI){ //中斷函數(shù)中對(duì)接收中斷的響應(yīng)
RI=0; //RI為接受中斷數(shù)據(jù)標(biāo)志位,接收完數(shù)據(jù)硬件置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網(wǎng)絡(luò)調(diào)試手段:
1、剛開(kāi)始可以通過(guò)TTL轉(zhuǎn)USB直接和ESP8266連接,通過(guò)電腦安信可軟件實(shí)現(xiàn)手動(dòng)發(fā)送AT指令,觀察ESP8266的返回值信息。
2、白盒測(cè)試:第一種調(diào)試手段比較蠢,我們需要手段發(fā)送AT指令,此時(shí)我們就需要通過(guò)51單片機(jī)來(lái)幫我們做這部分事,我們可以把單片機(jī)的TXD接到ESP8266的RXD,ESP8266的TXD再接到TTL轉(zhuǎn)USB的RXD,這樣我們就可以看到代碼運(yùn)行是否正確,在哪個(gè)環(huán)節(jié)出現(xiàn)問(wèn)題。
3、ESP8266直接與51單片機(jī)交互,單片機(jī)的TXD接到ESP8266的RXD,ESP8266的TXD再接到文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-462680.html
單片機(jī)的RXD,單片機(jī)把AT指令發(fā)送給ESP8266,讓ESP8266可以上網(wǎng),此時(shí)我們就可以通過(guò)網(wǎng)絡(luò)調(diào)試助手發(fā)送指令實(shí)現(xiàn)WiFi模塊對(duì)單片機(jī)IO口的操作。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-462680.html
到了這里,關(guān)于51單片機(jī)(ESP8266模塊)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!