粉丝篇:两个ESP32主从机通信开发教程(Wi-Fi TCP篇)_两个esp32 无线互传数据
应粉丝需要特别做了一期,本教程将详细讲解如何实现两个ESP32开发板之间的无线通信,主机作为TCP客户端,从机作为TCP服务器。提供完整代码及逐行解析。
一、通信方案选择
1.1 方案对比
本教程选用Wi-Fi TCP通信方案,适合大多数物联网场景。
二、开发环境准备
-
Arduino IDE 2.3.2+
-
安装ESP32开发包(通过Arduino Boards Manager)
-
USB数据线*2
-
路由器(或使用ESP32 SoftAP模式)
三、从机(TCP服务器)配置
3.1 硬件连接
-
通过USB连接电脑
-
无额外硬件要求
3.2 完整代码
#include // 网络配置const char* ssid = \"Your_SSID\"; // 路由器SSIDconst char* password = \"Your_PASS\"; // 路由器密码const int port = 3333; // 端口号WiFiServer server(port);void setup() { Serial.begin(115200); // 连接Wi-Fi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print(\".\"); } Serial.println(\"\\nWiFi connected\"); Serial.print(\"IP Address: \"); Serial.println(WiFi.localIP()); // 启动TCP服务器 server.begin();}void loop() { WiFiClient client = server.available(); if (client) { Serial.println(\"New Client Connected\"); while (client.connected()) { if (client.available()) { String message = client.readStringUntil(\'\\n\'); Serial.print(\"Received: \"); Serial.println(message); // 发送响应 client.print(\"ACK: \"); client.println(message); } } client.stop(); Serial.println(\"Client Disconnected\"); }}
3.3 关键代码解析
-
WiFiServer server(port):创建TCP服务器实例 -
server.available():检测客户端连接 -
readStringUntil(\'\\n\'):读取直到换行符 -
client.print():发送数据到客户端
四、主机(TCP客户端)配置
4.1 硬件连接
-
通过USB连接电脑
-
确保与从机在同一网络
4.2 完整代码
#include // 网络配置const char* ssid = \"Your_SSID\"; // 与从机相同const char* password = \"Your_PASS\"; const char* host = \"192.168.1.100\"; // 从机IP地址const int port = 3333;WiFiClient client;void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print(\".\"); } Serial.println(\"\\nConnected to WiFi\");}void loop() { if (!client.connected()) { Serial.println(\"Attempting connection...\"); if (client.connect(host, port)) { Serial.println(\"Connected to server\"); } else { Serial.println(\"Connection failed\"); delay(5000); return; } } // 发送数据 static unsigned long timer = 0; if (millis() - timer > 3000) { String data = \"Hello_\" + String(millis()); client.println(data); // 注意使用println自动添加\\n // 接收响应 String response = client.readStringUntil(\'\\n\'); Serial.print(\"Server response: \"); Serial.println(response); timer = millis(); }}
4.3 关键代码解析
-
client.connect():连接到指定IP和端口 -
client.println():带换行符发送 -
readStringUntil(\'\\n\'):同步读取响应
五、部署与测试流程
5.1 操作步骤
-
将从机代码中的
Your_SSID和Your_PASS改为实际值 -
上传从机代码,记录打印的IP地址
-
修改主机代码中的
host值为从机IP -
上传主机代码
5.2 预期输出
从机串口:
WiFi connectedIP Address: 192.168.1.100New Client ConnectedReceived: Hello_12345Client Disconnected
主机串口:
Connected to WiFiServer response: ACK: Hello_12345
六、进阶优化建议
6.1 稳定性增强
// 增加超时机制client.setTimeout(5000); // 添加心跳包检测if (millis() - lastHeartbeat > 15000) { client.println(\"HB\"); lastHeartbeat = millis();}
6.2 数据加密
建议使用SSL/TLS:
#include WiFiClientSecure client;client.setCACert(root_ca); // 添加证书
6.3 SoftAP模式
从机可设置为AP:
WiFi.softAP(\"ESP32_AP\", \"12345678\");Serial.print(\"AP IP: \");Serial.println(WiFi.softAPIP());
七、常见问题排查
Q1: 连接超时
-
确认IP地址正确
-
检查防火墙设置
-
验证端口未被占用
Q2: 数据不完整
-
确保使用
println添加终止符 -
增加数据校验:
client.print(data.length());client.print(\":\");client.println(data);
Q3: 频繁断开
-
添加重连机制:
void reconnect() { while (!client.connected()) { if (client.connect(host, port)) { // 重连后初始化操作 } }}
本教程提供完整的ESP32主从机通信解决方案,可根据实际需求扩展更多功能。建议使用PlatformIO进行项目管理,获得更好的开发体验。


