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

ESP8266-12F的UART引脚D9(RX)中断失效问题求助

ESP8266-12F D9(RX)中断无法触发的问题

我用Arduino IDE给ESP8266-12F编程,通过USB-UART转换器把模块的D9(RX)、D10(TX)引脚和笔记本电脑连接。目前TX功能正常,ESP8266发送的数据电脑能正常接收,但电脑向对应COM口发数据时,D9的RX中断触发不了,模块收不到消息,请问这是什么原因?

volatile boolean  interrupt_occurred = false; 
#define           LED_pin D1

void ICACHE_RAM_ATTR handleInterrupt() {
  digitalWrite(LED_pin, HIGH); // Interrupt occurred, so turn On LED
  interrupt_occurred = true;   // Record that an interrupt occurred
}

void setup() {
  noInterrupts();
  
  //for test
  pinMode(LED_pin, OUTPUT);   // LED pin to Output mode
  digitalWrite(LED_pin, LOW); // Turn LED off (High = On, Low = Off)

  pinMode(D10, FUNCTION_1); // Set D10 as UART transmitter
  pinMode(D9, FUNCTION_1); // Set D9 as UART receiver
  Serial.begin(115200, SERIAL_8N1); // initialize the serial

  //pinMode(D9, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(D9), handleInterrupt, FALLING);
  interrupts();
}


void loop() {
 
  delay(1000);
  
   if (interrupt_occurred == true) { 
    Serial.println("An interrupt occurred");
    delay(500);
    digitalWrite(LED_pin, LOW);     // Now turn Off LED, ready for the next interrupt
    interrupt_occurred = false;
  }  
}

问题原因及解决方法

  • 引脚复用冲突:你把D9配置为UART接收引脚(FUNCTION_1)的同时,又给它挂载了外部中断。ESP8266的引脚功能是复用的,当引脚被分配给硬件UART后,UART模块会接管该引脚的信号处理,外部中断会被直接屏蔽——同一个引脚不能同时被UART和外部中断模块占用。
  • 逻辑错误:UART通信的起始位是低电平,但用下降沿中断根本无法正确处理完整的UART数据帧,而且硬件UART已经占用引脚,外部中断本来就得不到响应。

正确处理方式

别用外部中断监听UART数据,直接用ESP8266硬件UART的内置接收机制:

  1. 删除attachInterrupt相关代码,无需外部中断。
  2. 在loop()中用Serial.available()检测是否有数据到来,再读取数据。

修改后的示例代码:

#define LED_pin D1

void setup() {
  pinMode(LED_pin, OUTPUT);
  digitalWrite(LED_pin, LOW);

  pinMode(D10, FUNCTION_1); // 设置D10为UART发送引脚
  pinMode(D9, FUNCTION_1);  // 设置D9为UART接收引脚
  Serial.begin(115200, SERIAL_8N1);
}

void loop() {
  if (Serial.available() > 0) {
    // 读取串口数据
    String receivedData = Serial.readStringUntil('\n');
    digitalWrite(LED_pin, HIGH);
    Serial.println("收到数据:" + receivedData);
    delay(500);
    digitalWrite(LED_pin, LOW);
  }
  delay(100);
}

额外检查点

  • 确认USB-UART转换器的TX接ESP8266的D9(RX),RX接ESP8266的D10(TX),交叉连接不能搞反(你TX功能正常,这部分大概率没问题,但可以再核对)。
  • 检查USB-UART转换器的电平:ESP8266是3.3V电平,不能直接用5V模块连接,否则可能损坏引脚或导致信号识别异常。
  • 确保串口工具的波特率、数据位、停止位、校验位和代码里的Serial.begin(115200, SERIAL_8N1)完全一致。

内容的提问来源于stack exchange,提问作者Jiaao Liu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:43:10