粉丝篇:两个ESP32主从机通信开发教程(Wi-Fi TCP篇)

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


一、通信方案选择

1.1 方案对比

通信方式传输距离速率复杂度功耗
Wi-Fi50-100m
蓝牙BLE10-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 <WiFi.h>

// 网络配置
const char* ssid = "Your_SSID";     // 路由器SSID
const 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 <WiFi.h>

// 网络配置
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 connected
IP Address: 192.168.1.100
New Client Connected
Received: Hello_12345
Client Disconnected

主机串口:

Connected to WiFi
Server response: ACK: Hello_12345

六、进阶优化建议

6.1 稳定性增强

// 增加超时机制
client.setTimeout(5000); 

// 添加心跳包检测
if (millis() - lastHeartbeat > 15000) {
  client.println("HB");
  lastHeartbeat = millis();
}

6.2 数据加密

建议使用SSL/TLS:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙大大L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值