You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32 WROOM通过socket()向PC传输数据失败问题求助

问题分析与解决方案

核心问题点

Python客户端代码错误

你的Python代码里判断连接状态的逻辑完全错误:if client == True永远不会成立,因为client是socket对象而非布尔值。connect()方法连接失败会直接抛出异常,成功则无返回值,不能用这种方式判断连接状态。另外,单次recv()可能无法捕获数据,且未处理连接异常。

ESP32服务器代码逻辑缺陷

ESP32代码的loop()函数中,客户端未连接时打印提示后执行client = server.available()就直接return,会导致后续逻辑无法执行,可能错过客户端连接时机。同时,ESP32仅在串口有输入时才会向WiFi客户端发送数据,PC端若未触发ESP32串口输入,自然收不到数据。


修复后的Python代码

import socket

port = 80
encoding = 'utf-8'
server_ip = "192.168.19.2"
addr = (server_ip, port)

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
    client.connect(addr)
    print("客户端已连接到服务器")
    
    # 循环接收数据,直到连接断开
    while True:
        data = client.recv(1024)
        if not data:
            print("连接已断开")
            break
        print(f"收到数据: {data.decode(encoding)}")
        
        # 将数据追加写入CSV文件
        with open('esp32_data.csv', 'a', encoding=encoding) as f:
            f.write(f"{data.decode(encoding)}\n")
            
except ConnectionRefusedError:
    print("无法连接到服务器,请检查ESP32是否正常运行、PC是否连接到LANZ热点")
except Exception as e:
    print(f"发生错误: {e}")
finally:
    client.close()

修复后的ESP32代码

#include <WiFi.h>
#include <WiFiClient.h>

int value = 3;
const char *ssid = "LANZ"; // ESP热点名称
const char *password = "123456789"; // ESP热点密码

WiFiServer server(80);
WiFiClient client;

void setup() {
  Serial.begin(9600);
  delay(1000);

  WiFi.mode(WIFI_AP);
  IPAddress ip(192, 168, 19, 2);
  IPAddress netmask(255, 255, 255, 0);
  WiFi.softAPConfig(ip, ip, netmask);
  WiFi.softAP(ssid, password);

  Serial.println("WiFi详情:");
  Serial.println(ssid);
  Serial.println(password);
  Serial.println(WiFi.localIP());
  server.begin();
}

void loop() {
  // 检查并获取新客户端连接
  if (!client.connected()) {
    client = server.available();
    if (client) {
      Serial.println("新客户端已连接");
    } else {
      delay(1000);
      return;
    }
  }

  // 串口有数据时,转发给WiFi客户端
  if (client.connected() && Serial.available()) {
    value = Serial.read();
    client.write(value);
    Serial.printf("已发送数据: %d\n", value);
  }
}

测试步骤

  1. 将修复后的代码分别烧录到ESP32,运行Python代码前确保PC已连接到LANZ热点。
  2. 打开ESP32的串口监视器,发送任意字符(如数字、字母),此时Python客户端应能接收并打印数据,同时自动写入CSV文件。

内容的提问来源于stack exchange,提问作者Bojack Horseman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 17:45:34