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); } }
测试步骤
- 将修复后的代码分别烧录到ESP32,运行Python代码前确保PC已连接到
LANZ热点。 - 打开ESP32的串口监视器,发送任意字符(如数字、字母),此时Python客户端应能接收并打印数据,同时自动写入CSV文件。
内容的提问来源于stack exchange,提问作者Bojack Horseman
相关产品推荐
相关产品推荐

