Arduino编译报错:RH_ASK与PulseSensorPlayground库__vector_11重复定义
433发射器与脉搏传感器编译冲突问题解决
我正在开发一个项目,通过脉搏传感器采集心率数据,再用433发射器发送至接收器。使用Arduino Nano开发板,Arduino IDE版本2.1.0,RH_ASK和PulseSensorPlayground库均为最新版,但编译时出现中断向量重复定义的错误。
项目代码
#include <RH_ASK.h> #include <SPI.h> #define USE_ARDUINO_INTERRUPTS true #include <PulseSensorPlayground.h> #define PULSENSORPIN A0 PulseSensorPlayground pulseSensor; RH_ASK transmitter; void setup() { Serial.begin(9600); transmitter.init(); pulseSensor.analogInput(PULSENSORPIN); pulseSensor.setThreshold(550); pulseSensor.begin(); } void loop() { delay(1000); int myBPM = pulseSensor.getBeatsPerMinute(); String str_myBPM = String(myBPM); const char *msg = str_myBPM.c_str(); transmitter.send((uint8_t *)msg, strlen(msg)); transmitter.waitPacketSent(); }
编译错误信息
C:\Users\Helen474402\AppData\Local\Temp\arduino\sketches\E400C37EF824CAD4EB4682519060B7A8\libraries\RadioHead\RH_ASK.cpp.o (symbol from plugin): In function `RH_ASK::maxMessageLength()': (.text+0x0): multiple definition of `__vector_11' C:\Users\Helen474402\AppData\Local\Temp\arduino\sketches\E400C37EF824CAD4EB4682519060B7A8\sketch\Transmitter.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here collect2.exe: error: ld returned 1 exit status exit status 1 Compilation error: exit status 1
问题原因与解决办法
- 核心原因:两个库同时占用了Arduino Nano的Timer2中断向量(__vector_11)。当
USE_ARDUINO_INTERRUPTS设为true时,PulseSensorPlayground会使用Timer2中断来检测脉搏;而RH_ASK库默认也依赖Timer2实现433MHz信号的调制,导致中断向量重复定义。
方案1:修改脉搏传感器的工作模式
将USE_ARDUINO_INTERRUPTS改为false,让PulseSensorPlayground以轮询模式运行,不再占用Timer2中断。修改后的代码如下:
#include <RH_ASK.h> #include <SPI.h> #define USE_ARDUINO_INTERRUPTS false // 禁用中断模式 #include <PulseSensorPlayground.h> #define PULSENSORPIN A0 PulseSensorPlayground pulseSensor; RH_ASK transmitter; void setup() { Serial.begin(9600); transmitter.init(); pulseSensor.analogInput(PULSENSORPIN); pulseSensor.setThreshold(550); pulseSensor.begin(); } void loop() { pulseSensor.read(); // 主动轮询传感器数据 static unsigned long lastSendTime = 0; // 每隔1秒发送一次数据,避免delay阻塞轮询 if (millis() - lastSendTime >= 1000) { lastSendTime = millis(); int myBPM = pulseSensor.getBeatsPerMinute(); String str_myBPM = String(myBPM); const char *msg = str_myBPM.c_str(); transmitter.send((uint8_t *)msg, strlen(msg)); transmitter.waitPacketSent(); } }
方案2:修改RH_ASK库的定时器配置
如果需要保留脉搏传感器的中断模式,可以修改RH_ASK库的定时器设置:
- 找到RH_ASK库的安装目录,打开
RH_ASK.h文件 - 找到
#define RH_ASK_TIMER 2这一行,将其改为#define RH_ASK_TIMER 1(切换到Timer1) - 保存文件后重新编译项目
注意:Timer1可能被其他库(如Servo)占用,若项目中未使用此类库则可放心修改。
内容的提问来源于stack exchange,提问作者kdb17wsl
相关产品推荐
相关产品推荐

