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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:57:41