ESP32关闭串口连接后持续重启问题求助
解决ESP32串口连接关闭后重启的问题
问题原因
你的问题本质是ESP32开发板的硬件设计导致的:绝大多数ESP32开发板的USB转串口芯片(比如CH340、CP2102)会将DTR引脚与ESP32的EN(使能)引脚绑定。当PC端关闭串口连接(或Python脚本结束自动关闭串口)时,USB转串口芯片会拉低DTR信号,触发ESP32的复位流程,导致设备重启。
解决方案
方案1:硬件修改(最直接)
找到开发板上连接DTR和EN引脚的走线或跳线,断开它们的连接:
- 如果是带跳线帽的开发板,拔掉DTR对应的跳线;
- 如果是贴片走线,用小刀轻轻划断DTR到EN的线路(注意不要伤到其他线路)。
修改后,串口关闭时就不会触发复位了。
方案2:改用其他UART端口(软件层面)
ESP32有3个UART端口,默认的UART0(对应USB串口)绑定了复位信号,我们可以改用UART1或UART2来通信,避开这个问题。
修改后的ESP32代码
#include "SerialTransfer.h" #include "SPI.h" #include <TFT_eSPI.h> // Hardware-specific library TFT_eSPI tft = TFT_eSPI(); SerialTransfer myTransfer; HardwareSerial Serial1(1); // 初始化UART1端口 void setup() { // 配置UART1的TX/RX引脚(这里用16作为TX,17作为RX,可根据你的开发板调整) Serial1.begin(115200, SERIAL_8N1, 16, 17); myTransfer.begin(Serial1); tft.begin(); tft.fillScreen(TFT_BLACK); } void loop() { static bool hasReceived = false; // 保存接收状态,避免重复刷新LCD if(myTransfer.available()) { if(!hasReceived) { tft.fillScreen(TFT_BLUE); hasReceived = true; } } }
修改后的Python代码
import time from pySerialTransfer import pySerialTransfer as txfer if __name__ == '__main__': # 替换为UART1对应的USB转TTL串口的COM口(比如把USB转TTL模块接ESP32的16/17引脚,再连PC) link = txfer.SerialTransfer('COMx') link.open() float_val = 5.234 # 不要用Python关键字"float"做变量名 float_size = link.tx_obj(float_val) link.send(float_size) time.sleep(2) link.close()
通信方式选型建议
针对你24/7通过USB连接PC供电的需求,三种方式的优缺点如下:
- USB串口:最优选择。解决复位问题后,兼具供电+通信功能,延迟低、带宽足,稳定性高,适合传输大量数据,配置也最简单。
- 蓝牙:适合短距离无线场景,但带宽低于USB,24/7连接的功耗略高(不过USB供电可不考虑),如果不需要无线则没必要选。
- WiFi:带宽高,支持远程传输,但依赖WiFi信号稳定性,配置复杂度高,延迟比串口高,仅在需要无线或远程访问时考虑。
内容的提问来源于stack exchange,提问作者Clinterpottrmus
相关产品推荐
相关产品推荐

