> 技术文档 > 粉丝篇:两个ESP32主从机通信开发教程(Wi-Fi TCP篇)_两个esp32 无线互传数据

粉丝篇:两个ESP32主从机通信开发教程(Wi-Fi TCP篇)_两个esp32 无线互传数据


应粉丝需要特别做了一期,本教程将详细讲解如何实现两个ESP32开发板之间的无线通信,主机作为TCP客户端,从机作为TCP服务器。提供完整代码及逐行解析。


一、通信方案选择

1.1 方案对比

通信方式 传输距离 速率 复杂度 功耗 Wi-Fi 50-100m 高 中 中 蓝牙BLE 10-50m 中 高 低 SPI <1m 极高 中 低 I2C <1m 中 低 低

本教程选用Wi-Fi TCP通信方案,适合大多数物联网场景。


二、开发环境准备

  1. Arduino IDE 2.3.2+

  2. 安装ESP32开发包(通过Arduino Boards Manager)

  3. USB数据线*2

  4. 路由器(或使用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 关键代码解析

  1. WiFiServer server(port):创建TCP服务器实例

  2. server.available():检测客户端连接

  3. readStringUntil(\'\\n\'):读取直到换行符

  4. 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 关键代码解析

  1. client.connect():连接到指定IP和端口

  2. client.println():带换行符发送

  3. readStringUntil(\'\\n\'):同步读取响应


五、部署与测试流程

5.1 操作步骤

  1. 将从机代码中的Your_SSIDYour_PASS改为实际值

  2. 上传从机代码,记录打印的IP地址

  3. 修改主机代码中的host值为从机IP

  4. 上传主机代码

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进行项目管理,获得更好的开发体验。