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-8266出厂波特率正常是115200, 注意:AT指令,控制类都要加回车,数据传输时不加回车
一,esp8266当成wifi接收器
第一步上电后发送AT指令测试通信及模块功能是否正常
AT
OK
第二步通过命令配置成9600波特率
AT+UART=9600,8,1,0,0
入网设置及接入服务器
首先封装一个输出字符的函数sendString
void sendString(char* str)
{
while( *str != '\0'){
sendByte(*str);
str++;
}
}
封装中断函数,接收esp的反馈,由此可以让单片机判断是否输入下一台指令
void Uart_Handler() interrupt 4
{
static int i = 0;//静态变量,被初始化一次
char tmp;
if(RI)//中断处理函数中,对于接收中断的响应
{
RI = 0;//清除接收中断标志位
tmp = SBUF;
if(tmp == 'W' || tmp == 'O' || tmp == 'L' || tmp == 'F'){
i = 0;
}
buffer[i++] = tmp;
//入网成功的判断依据WIFI GOT IP
if(buffer[0] == 'W' && buffer[5] == 'G'){
AT_Connect_Net_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++){
D5 = 0;
Delay1000ms();
D5 = 1;
Delay1000ms();
}
sendString(RESET);
memset(buffer, '\0', SIZE);
}
//灯控指令
if(buffer[0] == 'L' && buffer[2] == '1'){
D5 = 0;//点亮D5
memset(buffer, '\0', SIZE);
}
if(buffer[0] == 'L' && buffer[2] == '0'){
D5 = 1;//熄灭D5
memset(buffer, '\0', SIZE);
}
if(i == 12) i = 0;
}
}
设置工作模式
AT+CWMODE=1 //1. 是station(设备)模式 2.是AP(路由)模式 3.是双模
OK
以设备模式接入家中路由器配置
AT指令
AT+CWJAP="自家的WiFi名称","自家的WiFi密码" //指令
WIFI CONNECTED //结果
WIFI GOT IP //结果
c代码体现
code char LJWL[] = "AT+CWJAP=\"自己家WiFi名字\",\"自己家WiFi密码\"\r\n"; //入网指令
用sendString输出LJWL,并等待esp反馈
//发送联网AT指令并等待成功
sendString(LJWL);
while(!AT_Connect_Net_Flag);
while(!AT_OK_Flag);
AT_OK_Flag = 0;
AT_Connect_Net_Flag = 0;
这里的 AT_OK_Flag和AT_Connect_Net_Flag 是一个标志位,其初始值为0。用来接收esp的反馈,看看是否发送正确,并正确收到,然后执行下一步,用完之后要归0.出来混迟早要还的哈哈哈哈
这里调用AT讲的比较细,后面我就不赘述啦,直接上代码。
查询IP地址,这个不用单片机来实现(接收了也没啥用),想看ip地址可以用串口助手查看
然后打开自己的pc网络调试助手(windows终端查询自己连的wifi的ip地址)
终端指令:ipconfig
端口号随意吧
开始接入服务器
AT指令
AT+CIPSTART="TCP","自己的windows端口号",8888 //指令,注意双引号逗号都要半角(英文)输入
CONNECT //结果:成功
OK //结果:成功
c语言体现
code char LJFWQ[] = "AT+CIPSTART=\"TCP\",\"192.168.1.101\",8880\r\n"; //连接服务器指令
//发送连服务器指令并等待成功
sendString(LJFWQ);
while(!AT_OK_Flag);
AT_OK_Flag = 0;
开启透传模式
AT有个很呆的指令,需要自己提前输入要发几个字符,但是开启透传就不用提前说明,想发多大字节就发多大字节,一个字,爽
AT+CIPSEND=4 // 设置即将发送数据的长度 (这里是4个字节)
>CLCA // 看到大于号后,输入消息,CLCA,不要带回车
Response :SEND OK //结果:成功
//注意,这种情况下,每次发送前都要先发送AT+CIPSEND=长度 的指令,再发数据!
AT+CIPMODE=1 //开启透传模式
Response :OK
退出透传模式
3.5.6 单片机帮你做这一切
AT+CIPSEND //带回车
Response: > //这个时候随意发送接收数据咯
透传模式,爽!
c代码实现:
char TCMS[] = "AT+CIPMODE=1\r\n"; //透传指令
//发送透传模式指令并等待成功
sendString(TCMS);
while(!AT_OK_Flag);
AT_OK_Flag = 0;
开始数据传输
char SJCS[] = "AT+CIPSEND\r\n"; //数据传输开始指令
//发送数据传输指令并等待成功
sendString(SJCS);
while(!AT_OK_Flag);
接下来就可以随意爽了
在透传发送数据过程中,若识别到单独的⼀包数据 “+++”,则退出透传发送。
二,esp8266当成wifi路由器(服务器)
首先设置成路由器模式
//1 配置成双模
AT+CWMODE=2
Response :OK
c代码实现
/1 工作在路由模式
char LYMO[] = "AT+CWMODE=2\r\n";
sendString(LYMO);
while(!AT_OK_Flag);
AT_OK_Flag = 0;
需要使能多连接
//2 使能多链接
AT+CIPMUX=1
Response :OK
c代码实现
//2 使能多链接
char DLJ[] = "AT+CIPMUX=1\r\n";
sendString(DLJ);
while(!AT_OK_Flag);
AT_OK_Flag = 0;
建立TCP接收,点亮标志位
//3 建立TCPServer
AT+CIPSERVER=1 // default port = 333
Response :OK
c代码实现
//3 建立TCPServer
char JLFW[] = "AT+CIPSERVER=1\r\n"; // default port = 333
sendString(JLFW);
while(!Client_Connect_Flag);
AT_OK_Flag = 0;
if(Client_Connect_Flag){
D5 = 0;//点亮D5,代表有客户端接入
}
开始发送数据和接收数据
//4 发送数据
AT+CIPSEND=0,5 // 发送5个字节在连接0通道上
>abcd //输入数据,不带回车
Response :SEND OK
//• 接收数据
+IPD, 0, n: xxxxxxxxxx //+IPD是固定字符串 0是通道,n是数据长度,xxx是数据
c代码实现:
//发送数据
char FSSJ[] = "AT+CIPSEND=0,5\r\n";
//4 发送数据
sendString(FSSJ);
Delay1000ms();
Delay1000ms();
sendString("Hello");
Delay1000ms();
Delay1000ms();
这里不确定esp的发送数据反馈,就用了最简单的延时
最后关闭服务器
//断开连接
AT+CIPCLOSE=0
Response :0, CLOSED OK