1、导言
市面上主要的ESP8266有两种,一种是01S(左图), 还有一种是NodeMCU版本(右图)(通常为12E,可以自己观察金属屏蔽罩上刻印)。
两者其实都由一颗ESP8266作为主控,不过NodeMCU版本将全部引脚全都引出,同时有着USB直连的CH340/CP2102串口。
对于8266,无论是哪种版本,主要的编程方式有两种,AT指令与基于Arduino IDE开发,具体如何配置就不详细展开,这部分很简单。
使用AT指令开发时,8266主要只是扮演一个WiFi模块的作用,而ESP8266,之所以有着和ESP32一样的前缀,便代表着它也是单片机的一种,因而通过Arduino IDE开发可以发挥更多的性能,同时也能实现AT指令所能实现的功能,并且自由度更高。
因此,如果是简单作为WiFi模块使用,可以考虑使用AT指令,但如果在WiFi之余要实现其他的附加功能,还是推荐Arduino IDE开发的方式,自由度高,更加稳定,易于开发。
要实现ESP8266双向透传,首先要有两块ESP8266 。无论是小模块样式的01S, 还是开发板样式的NodeMCU均可。
而后,如果是要基于AT指令实现,还要保证两者都烧录了AT固件,一般01S都出厂已烧录,NodeMCU可能未烧录,烧录方式见另一篇博文:--2025-最新可靠-- ESP8266-01S/NodeMCU AT固件烧录,作为WiFi模块-快速入门!-CSDN博客
注意:使用Arduino IDE开发过ESP8266后,可能导致原来的AT固件被覆盖删除,无法再使用AT指令开发,此时同样需要用上面链接里面的方法重新烧录AT固件。
为什么写这篇文章?因为现在网上的大部分ESP-8266透传的文章都很烂!要么只能单向,要么双向透传不稳定,也不能上电后自动化配置!要么过于复杂,影响单片机程序的简洁和其他功能的实现!
本文的目标:即插即用、简单稳定、高效易开发的ESP-8266双向透传!
2、基于AT的双向透传
主要实现效果:两块8266分别接到两个不同设备的串口上,可以是两个STM32, 或者其他任何支持串口的嵌入式设备,单片机1发送到串口的所有数据被自动无线传输到单片机2,单片机2发送到串口的数据被无线传输到单片机1。
一块8266使用STA(station,站点)模式,即客户端。
另一块8266使用AP模式,即服务器端,创建WiFi热点,另一块8266连接到热点上实现通讯。
2.1 AP模式的服务器端8266配置
首先完成AP模式的服务器端8266配置,将8266通过USB-TTL或数据线连接到电脑上,使用串口助手打开对应串口。
然后勾选上“发送新行”,
然后逐句发送:
AT //测试AT固件是否正常,预期返回 OK,否则可以多试几次,不然重新烧录AT
AT+CWMODE=2 //设置为AP模式
AT+RST //重启8266,确保更改生效
AT+CWSAP="TJC-8266","TJC12345",1,4 //创建WiFi热点,
//第一个参数为WiFi名称,第二个为密码(8位),后两个参数可以不改,有兴趣可以自己搜索
AT+CIPMUX=1 //设置为多连接模式,因为后面要建立服务器
AT+CIFSR //查询自身IP地址,后面有用,一般为 192.168.4.1
AT+CIPSERVER=1,8086 //建立服务器,第一个参数为通道,第二个为端口号,可自己选择
-----------------------------------------------------------------------------
//当有设备连接后,可以通过下面的指令将信息发送给下属设备
//第一个参数默认0,第二个为要传输的数据长度,如5个字节
AT+CIPSEND=0,5
xxxxx //任意五个字节的数据,每次发送都要重新调用上一句
2.2 STA模式的客户端8266配置
然后进行STA模式的客户端8266配置,首先保证前一个8266不要断电,最好还连着串口且串口助手也打开,方便观察。(大部分串口助手都可以多开)
然后将这个新8266通过USB-TTL或数据线连接到电脑上,使用串口助手打开对应串口。
然后勾选上“发送新行”,
然后逐句发送:
AT //测试AT固件是否正常,预期返回 OK,否则可以多试几次,不然重新烧录AT
AT+CWMODE=1 //设置为STA模式
AT+RST //重启8266,确保更改生效
AT+CWJAP="TJC-8266","TJC12345" //连接服务器端8266创建的WiFi热点,名称和密码要对应上
AT+CIPSTART="TCP","192.168.4.1",8086 //连接服务器端8266创建的TCP服务器,
//注意要使用服务器端8266的IP地址和服务器端口号(AP按上述配置后,该IP地址一般不会变化)
AT+CIPMODE=1 //开启透传模式
AT+CIPSEND //启动自动透传,后面可任意发送任何长度数据,并且发送前无需任何命令
//退出时发送+++(三个+号并且不带新行)
2.3 AT双向透传自动化连接
1、STA模式的客户端
对于STA模式的客户端而言,AT指令的上电后自动连接非常简单,只需要在配置时,AT+CIPMODE=1后,发送一句
AT+SAVETRANSLINK=1,"192.168.4.1",8086,"TCP"
//第一个参数1代表开启上电自动透传
//第二个为服务器ip,第三个为服务器端口号,第四个为透传协议(一般使用TCP)
所以STA的全配置流程变为:
AT
AT+CWMODE=1
AT+RST
AT+CWJAP="TJC-8266","TJC12345"
AT+CIPSTART="TCP","192.168.4.1",8086
AT+CIPMODE=1
AT+SAVETRANSLINK=1,"192.168.4.1",8086,"TCP"
AT+CIPSEND
(后可无限次直接透传)
(+++不带新行退出)
注意,AT+CIPSEND和AT+SAVETRANSLINK开启透传后,会使得所以串口发送内容变为透传信息,AT指令会无效,需要先退出透传才能使AT指令生效。
2、AP模式的服务器端
而对于AP模式的服务器端,只能完成半自动化。
在WiFi创建后,重新上电后会自动重新创建上次配置的WiFi热点,名称和密码不变。因此客户端的8266重新上电后也能自动连接上这个WiFi
但是,创建服务器的操作并不会被继承,所以需要服务器端连接的嵌入式设备,例如stm32,在初始化时向串口逐句发送AT指令
AT+CIPMUX=1
AT+CIPSERVER=1,8086
以stm32为例,假设串口已重定向至连接8266的串口
printf("AT+CIPMUX=1\r\n");
HAL_Delay(500); //建议添加延时使得8266有时间响应
printf("AT+CIPSERVER=1,8086\r\n");
3、总结
在AT实现的自动化双向透传下,实现的效果为:STA上电后会自动不断寻找目标WiFi和服务器以连接,AP上电后自动创建WiFi热点,而后等待单片机指令以创建服务器。
最后当STA连接上AP后即可实现双向透传,
但此时客户端向服务器端透传无需额外命令,不限制长度,但服务器接收到的数据会自动带有类似“+IPD,1,19:”的前缀,不便于后续串口数据解析,需要服务器端连接的单片机在程序中单独解析,如果连接的是被动解析协议的串口屏,会导致串口屏直接无法解析。
而服务器端向客户端透传虽然不会有前缀,但是每次发送前都必须发送AT+CIPSEND=0,X 需要额外命令并且定长,并不优越。
因此,纯AT下的8266双向透传有很大缺陷。
3、AT+Arduino IDE 混合的8266双向透传
对于上面AT的自动化困难,透传调用与解析的问题,可以使用AT+Arduino IDE 混合的8266双向透传解决问题。
一般情况下,建议数据处理端(如stm32)连接01S,数据采集与控制端(如串口屏)连接NodeMCU,当然,两边都链接NodeMCU最好,都链接01S也不是不行。
下面以第一种情况为例,其他情况应该也适用。
还是分为
一块8266使用STA(station,站点)模式,即客户端,此时是01S
另一块8266使用AP模式,即服务器端,创建WiFi热点,此时是NodeMCU。
3.1 STA模式的客户端8266配置
对于STA模式的01S,还是使用AT方案初始化配置,但是注意,上面AT方案是先配置AP,再配置STA,所以建议先跟着AT方案整个走一遍,将服务器端和客户端都先用AT方案初始化,再进行下面的AT+Arduino IDE 混合方案。
3.2 AP模式的服务器端8266配置
STA模式的客户端01S初始化完成后,将NodeMCU通过数据线连接到电脑上,打开Arduino IDE,相关环境配置可自己搜索,在“工具”中选择好串口,选择开发板为esp8266>NODEMCU 1.0
然后代码全选,替换为如下代码,然后下载到开发板上
#include <ESP8266WiFi.h>
// --- 1. 配置您的网络 ---
const char *ssid = "TJC-8266"; // AP 的名称 (SSID)
const char *password = "TJC12345"; // AP 的密码 (至少8位)
const int tcpPort = 8086; // TCP 服务器端口
// --- 2. 定义服务器和客户端对象 ---
WiFiServer server(tcpPort);
WiFiClient client; // 用来处理已连接的客户端
void setup() {
// 启动硬件串口,用于和您的串口屏通信
// 请根据您的串口屏要求的波特率进行修改,例如 9600, 115200 等
Serial.begin(115200);
// 在串口打印一些调试信息(这些信息会发送给串口屏,调试完成后可删除)
Serial.println("\nNodeMCU AP Server is starting...");
// 启动 AP 模式
WiFi.softAP(ssid, password);
// 打印 AP 的 IP 地址(STA 端需要连接这个 IP)
// 默认情况下,ESP8266 AP 的 IP 地址是 192.168.4.1
Serial.print("AP IP address: ");
Serial.println(WiFi.softAPIP());
// 启动 TCP 服务器
server.begin();
Serial.print("TCP Server started on port: ");
Serial.println(tcpPort);
Serial.println("Waiting for a client to connect...");
}
void loop() {
// --- 3. 管理客户端连接 ---
// 检查是否有新的客户端连接进来
if (!client.connected()) {
// 释放之前可能存在的无效客户端
client.stop();
// 查找新的客户端
client = server.available();
if (client) {
// 可以在串口输出提示信息,表示有客户端连接成功
// 注意:此消息也会被发送到串口屏
Serial.println("Client connected!");
}
return; // 如果没有客户端,则直接返回,不执行后续代码
}
// --- 4. 双向数据转发 ---
// a) 从 TCP 客户端 (STA) 接收数据,转发到串口 (串口屏)
// 如果客户端有数据发过来
while (client.available()) {
// 读取一个字节并直接写入串口
Serial.write(client.read());
}
// b) 从串口 (串口屏) 接收数据,转发到 TCP 客户端 (STA)
// 如果串口有数据进来
while (Serial.available()) {
// 读取一个字节并直接发送给客户端
client.write(Serial.read());
}
}
下载到开发板上后,即完成了AT+Arduino IDE 混合的8266双向透传的配置。
3.3 总结
混合情况的优势在于,可以实现客户端后服务器端的完全自动化,无需8266连接的两个设备程序中单独对8266初始化,增加缓冲区等复杂代码,显著降低项目复杂度。
同时,此时客户端到服务器端,或者服务器端到客户端,均是无需额外命令,不定长的收/发消息,并且不含任何影响解析的前缀/后缀,即插即用。
4、基于Arduino IDE的双向透传
单纯基于Arduino IDE的双向透传,在无AT方案缺陷的同时,稳定性比混合方案更高,配置上,只需在Arduino IDE单独为AP和STA端写代码即可,AP端代码混合方案中已有。
STA端代码同理。
但是,一般而言,01S并不是非常适合使用Arduino IDE开发,连接就较为不方便,虽然还是可以,但是不建议。同时混合模式下,AT初始化STA端也足够简单,所以STA端的Arduino IDE代码就不放了,读者可以把AP端代码扔给ai,让他生成对应的STA端透传代码。
5、注意事项
1、ESP-01S使用AT开启透传之后,不能仅由USB-TTL供电,会导致供电不足,功能异常,建议使用单片机/电源模块供电,但是如果还需要USB-TTL在电脑串口助手上查看数据,注意要讲USB-TTL的GND和单片机/电源模块的GND相连,实现共地!
2、AT指令发出后,如果收到“error”,有可能是AT指令里面符号问题,尤其是引号,必须是英文符号,CSDN有的时候粘贴出来是中文引号!