- ESP8266模块(新版本&旧版本)
引脚说明:
• VCC接3.3v,接5v时间长了可能会烧
• UTXD,URXD和其它的TXD,RXD接时注意交叉接就行了
• CH_PD要给高电平模块才工作
• GPIO0一般不用管,烧录固件时要接地
• RST低电平复位,高电平工作(默认高)
• GPIO2必须为高电平,内部默认已拉高,不用管
配置模块时,下载器与模块连线图:
烧写固件时,下载器与模块连线图:
ESP8266有三种工作模式:
1、 Station模式
2、 SoftAP模式
3、 Station + SoftAP模式
出厂设置为第三种,上电后,蓝灯微弱闪烁后熄灭(新版:红灯长亮 ,旧版:红灯熄灭)
- 解读三种模式
2.1 ESP8266 在 Station 模式ESP8266 作为 Station,通过路由器(AP) 连入 internet ,可向云端服务器上传、 下载数据。用户可随时使用移动终端(手机、 笔记本等) ,通过云端监控 ESP8266 模块的状况, 向 ESP8266 模块发送控制指令。
2.2 ESP8266 在 SoftAP 模式
ESP8266 作为 SoftAP,手机、 电脑、 用户设备、 其他 ESP8266 Station 接口等均可以作为 Station 连入ESP8266, 组建成一个局域网。
2.3 ESP8266 在 SoftAP + station 共存模式
ESP8266 支持 SoftAP + Station 共存的模式,用户设备、 手机等可以作为Station 连入 ESP8266 的 SoftAP 接口,同时, 可以控制 ESP8266 的 Station接口通过路由器(AP) 连入 internet。
- 解读透传功能
透传, 即透明传输功能。 Host 通过 uart 将数据发给 ESP8266, ESP8266 再通过无线网络将数据传出去; ESP8266 通过无线网络接收到的数据,同理通过uart 传到 Host。 ESP8266 只负责将数据传到目标地址,不对数据进行处理,发送方和接收方的数据内容、 长度完全一致,传输过程就好像透明一样。
透传需要先建立连接:
无线网络参数:
网络名称(SSID)
安全模式
密钥(password)
TCP 连接参数
协议类型
连接类型(client)
目的 IP 地址
目的端口
串口参数
波特率
数据位
检验位
停止位
硬件流控 - UART 成帧机制
ESP8266 判断 UART 传来的数据时间间隔,若时间间隔大于 20ms, 则认为一帧结束;否则, 一直接收数据到上限值 2KB, 认为一帧结束。 ESP8266 模块判断UART 来的数据一帧结束后, 通过 WIFI 接口将数据转发出去。
成帧时间间隔为 20ms, 一帧上限值为 2KB。
- 无线遥控应用
Phone 作为 Station, 连入 ESP8266 提供的 SoftAP, ESP8266 可通过 UART 与设备相连,进行无线控制。
- 远程连接应用
ESP8266 作为 Station, 通过无线路由(AP) 连入 internet,可以向云端服务器上传数据、 下载固件更新;移动终端(手机、笔记本等) 也可以通过云端服务器, 远程控制 ESP8266。
- 透明串口
用户设备的主 IC 作为 Host, 通过 UART 向 ESP8266 发送数据, ESP8266 再将数据通过无线网络传输给目的地址, 实现透明传输的功能。
- 设置波特率:(新版本出厂波特率115200,旧版本不确定可以挨个试)
执行过上面那两条指令后,关闭串口并把串口波特率从9600换为115200,这时在重新打开串口,发送指令AT,若没出现乱码,则说明波特率修改完成。
9. 模式的配置
9.1 模块SoftAP模式下做tcp server(意思就是模块是服务器,客户端去连模块)
AT+CWMODE=2 开启 AP 模式
AT+RST 重启指令,设置新的工作模式后需重启才能生效。我的模块不需要这条指令也行
AT+CWSAP=“ESP8266”,“0123456789”,11,0 设置模块的 wifi 、密码、通道号、加密方式
AT+CIPMUX=1 打开多连接
AT+CIPSERVER=1,8899 设置模块服务器端口,连接模块建立的无线网ESP8266.打开手机网络调试助手,在tcp client模式下,输入模块的 ip 和设置的端口。如图模块默认的 ip 为 192.168.4.1,端口为自己设定的 8899(默认的为 333) .
AT+CIPSEND=0,10 进入数据发送模式为十个字节
> 进入发送模式
0123456789 发送的 10 个数据
把WiFi模块与下载器连接后,再用串口线把下载器连接到PC机,打开安信可串口调试助手,选择正确的串口号及波特率,然后打开串口,按上面的指令开始配置。如下图:
执行到第5条AT+CIPSERVER=1,8899指令后,就可以打开手机连接这个热点了。
连上后,打开手机上的网络调试助手app,在下面第二幅图片中的IP是服务器的IP。我们可以发送AT+CIFSR指令查看服务器IP,然后输入到第二幅图的IP栏,端口号是我们在上面的指令中自己设置的,设置完成后点击Connect。
![]()
完成上述操作后,串口调试助手会显示“0,CONNET”其中0表示连入的这个client的id,指令AT+CIPSEND=0,10中的0就是指的这个客户端,给它发10字节数据
9.2模块在SoftAP模式下做tcp client(意思就是模块是客户端,模块去连服务器)
AT+CWMODE=2 设置AP模式
AT+CWSAP=“ESP8266”,“0123456789”,11,0 设置模块的 wifi 、密码、通道号、加密方式
AT+CIPMUX=1 开启多连接模式
AT+CIPSTART=2,“TCP”,“192.168.4.2”,8081 手机网络调试助手tcp server模式下 ip 192.168.4.2 和端口 8081,先设置再去查看监听,设置成功后再通过串口发送这条指令进行连接。
AT+CIPSEND=2,6 向服务器发送6字节数据
> 进入发送模式
123456 发送的6字节数据
9.3 模块Station+SoftAP模式下做tcp server
AT+CWMODE=3 设置 AP 和 STA 共存模式
AT+RST 重启指令,设置新的工作模式后需重启才能生效,我的模块不需要这条指令
AT+CWLAP 查询附近 wifi
AT+CWJAP=“1”,“2580147369” 连接附近知道密码的wifi
AT+CIFSR 查看路由器分配的 IP,例如 192.168.4.1
AT+CIPMUX=1 打开多连接
AT+CIPSERVER=1,8899 设置模块服务器端口,端口 8899(默认的为 333),打开手机网络调试助手,在tcp client模式下连接模块的 ip 和端口号。
AT+CIPSEND=0,10 进入数据发送模式为十个字节
> 进入发送模式
0123456789 发送的 10 个数据
执行AT+CIPSERVER=1,8899指令后,就可以打开手机连接热点。那么我们是连接热点“ESP8266”还是热点“1”呢?
我们输入指令AT+CIFSR得到以下信息:
+CIFSR:APIP,“192.168.4.1”
+CIFSR:APMAC,“1a:fe:34:0a:54:97”
+CIFSR:STAIP,“192.168.1.102”
+CIFSR:STAMAC,“18:fe:34:0a:54:97”
从这些信息中,我们可以知道当我们连接热点“ESP8266”时,我们打开手机网络调试助手,在tcp client模式下,这时我们输入服务器ip就是192.168.4.1,端口号8899。
当我们连接的热点是“1”时,在tcp client模式下,我们输入服务器IP就是192.168.1.102,端口号8899。
连上后,打开手机上的网络调试助手app
![]()
完成上述操作后,串口调试助手会显示“0,CONNET”其中0表示连入的这个client的id,指令AT+CIPSEND=0,10中的0就是指的这个客户端,给它发10字节数据
9.4 模块在ap+sta模式下tcp client透传模式
AT+CWMODE=3 设置 AP 和 STA 共存模式
AT+RST 重启指令,设置新的工作模式后需重启才能生效,我的模块不需要这条指令
AT+CWLAP 查询附近 wifi
AT+CWJAP=“1”,“2580147369” 连接附近你知道密码的 wifi
AT+CIFSR 查看路由器分配的 IP,例如 192.168.4.1
AT+CIPMUX=0 设置单连接
AT+CIPMODE=1 设置透传模式
AT+CIPSTART=“TCP”,“192.168.1.101”,8890 手机 server 端的 ip 192.168.1.101 和端口 8890,先设置再去查看监听,设置成功后再通过串口去发送连接指令进行连接。
AT+CIPSEND 开始发送数据
> 进入发送模式
+++ 注意退出透传,直接发送。取消发送新行
注意透传只能在单连接模式下进行,所以在建立连接之前一定要用(AT+CIPMUX=0
设置单连接),但是模块处于服务器模式下时,必须要多链接,由于冲突,所以模块开启服务器模式不能做 tcp 透传!
当执行到第7条AT+AT+CIPMODE=1指令时,这时手机连接热点名为“1”,密码为“2580147369”的热点。
再接着打开手机上的网络调试助手app,在tcp server模式下,我们把端口设置为8890,然后点击“Connect”,点击后变为下面的第二个界面。
![]()
然后,接着发第8、9、10条指令,网络调试助手app发8266:
![]()
要退出透传的话,把“发送新行”前的对号去掉,然后发送第10条指令。
9.5 模块Station模式下做tcp server
AT+CWMODE =1 开启Station模式
AT+CWJAP=”1”,”2580147369” 加入无线网络
AT+CIPMUX=1 开多连接模式
AT+CIPSERVER=1,8081 创建服务器
AT+CIFSR 查看本地IP地址
AT+CIPSEND=0,6 给ID为0的客户端发6个字节数据
> 进入发送模式
012345 发送的数据
9.6 模块Station模式下做tcp client
AT+CWMODE =1 开启Station模式
AT+CWJAP=”1”,”2580147369” 加入无线网络
AT+CIPMUX=1 开多连接模式
AT+CIPSTART=2,”TCP”,”192.168.1.101”,8088 建立TCP连接,在执行这条指令之前,先在网络调试助手tcp server 模式下,创建服务器。
AT+CIPSEND=2,6 给服务器2,发6字节数据
> 发送数据模式
012345 发送的数据
代码部分:
uart3.h文件
#ifndef __UART3_H__
#define __UART3_H__
extern bit busy3;
void Uart3Init(void);
void Uart3_Byte(char dat);
void Uart3_String(char *s);
#endif
uart3.c文件
#include "stc8.h"
#include "uart3.h"
bit busy3;
// 串口3初始化
void Uart3Init(void) // 115200bps@12.000MHz
{
S3CON = 0x10; // 8位数据,可变波特率
S3CON &= 0xBF; // 串口3选择定时器2为波特率发生器
AUXR |= 0x04; // 定时器2时钟为Fosc,即1T
T2L = 0xE6; // 设定定时初值
T2H = 0xFF; // 设定定时初值
AUXR |= 0x10; // 启动定时器2
IE2 = ES3; // 使能串口3中断
EA = 1; // 开总中断
}
/******** 发送一个字节数据 **********/
void Uart3_Byte(char dat)
{
while(busy3);
busy3 = 1;
S3BUF = dat;
}
/******** 发送一个字符串 **********/
//void Uart3_String(char *s)
//{
// while(*s != '\0')
// {
// Uart3_Byte(*s++);
// }
//}
char putchar(char c)
{
Uart3_Byte(c);
return c;
}
SoftAP模式的main.c文件
#include <stc8.h>
#include <stdio.h> // 在uart3.c文件中重写putchar方法后,再加上这个头文件,就可以使用printf
#include "uart3.h"
sbit LED1=P6^0;
typedef unsigned int uint;
typedef unsigned char uchar;
uchar receive[2];
uchar sign=0;
void Delay_ms(uint xms)
{
uint i, j;
for(i=xms;i>0;i--)
for(j=921;j>0;j--);
}
// 单片机向ESP8266模块发送AT指令
void wifi_init()
{
// 如果ESP8266之前,已经配置过下列语句
printf("AT+CWMODE=2\r\n");
Delay_ms(1000); // 延时一下
printf("AT+CWSAP=\"ESP8266\",\"0123456789\",11,0\r\n");
Delay_ms(1000);
// 那么只要下面两条语句也行
printf("AT+CIPMUX=1\r\n");
Delay_ms(1000);
printf("AT+CIPSERVER=1,8899\r\n");
Delay_ms(1000);
}
void wifi_data()
{
if(receive[0]=='A')
LED1=0; // 亮
if(receive[0]=='B')
LED1=1; // 灭
}
void main()
{
P_SW2 = 0x02; // RXD3_2/P5.0, TXD3_2/P5.1
Uart3Init(); // 串口3初始化
wifi_init(); // ESP8266初始化
while(1)
{
wifi_data();
}
}
// 中断程序,此程序只把+IPD,x,x:后的有用数据存进receive数组里
void Uart3_isr() interrupt 17
{
if(S3CON & S3RI)
{
S3CON &= ~S3RI;
if(sign==1)
{
receive[0] = S3BUF;
sign = 0; // 保存receive[0]的数据
}
if(S3BUF==':')
sign = 1;
}
if(S3CON & S3TI)
{
S3CON &= ~S3TI;
busy3 = 0;
}
}
Station+SoftAP模式的main.c文件
#include <stc8.h>
#include <stdio.h> // 在uart3.c文件中重写putchar方法后,再加上这个头文件,就可以使用printf
#include "uart3.h"
sbit LED1=P6^0;
typedef unsigned int uint;
typedef unsigned char uchar;
uchar receive[2];
uchar sign=0;
void Delay_ms(uint xms)
{
uint i, j;
for(i=xms;i>0;i--)
for(j=921;j>0;j--);
}
// 单片机向ESP8266模块发送AT指令
void wifi_init()
{
// 如果ESP8266之前,已经配置过下列语句
printf("AT+CWMODE=3\r\n");
Delay_ms(1000); // 延时一下
printf("AT+CWLAP\r\n");
Delay_ms(1000);
// 下面这个热点“1”是可以上网的热点,也就是它能被ESP8266查询到
printf("AT+CWJAP=\"1\",\"2580147369\"\r\n");
Delay_ms(1000);
printf("AT+CIFSR");
Delay_ms(1000);
// 那么只要下面两条语句也行
printf("AT+CIPMUX=1\r\n");
Delay_ms(1000);
printf("AT+CIPSERVER=1,8899\r\n");
Delay_ms(1000);
}
void wifi_data()
{
if(receive[0]=='A')
LED1=0; // 亮
if(receive[0]=='B')
LED1=1; // 灭
}
void main()
{
P_SW2 = 0x02; // RXD3_2/P5.0, TXD3_2/P5.1
Uart3Init(); // 串口3初始化
wifi_init(); // ESP8266初始化
while(1)
{
wifi_data();
}
}
// 中断程序,此程序只把+IPD,x,x:后的有用数据存进receive数组里
void Uart3_isr() interrupt 17
{
if(S3CON & S3RI)
{
S3CON &= ~S3RI;
if(sign==1)
{
receive[0] = S3BUF;
sign = 0; // 保存receive[0]的数据
}
if(S3BUF==':')
sign = 1;
}
if(S3CON & S3TI)
{
S3CON &= ~S3TI;
busy3 = 0;
}
}
安信可串口调试助手、网络调试助手app(Android版本)、网络调试助手(PC版本)、烧录WiFi固件工具四个软件的下载地址:https://download.csdn.net/download/weixin_43915898/11617094