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的内置接收机制:
- 删除
attachInterrupt相关代码,无需外部中断。 - 在
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
相关产品推荐
相关产品推荐

