“Tone.cpp.o (symbol from plugin): In function `timer0_pin_port'”这个错误是波波在Arduino上使用IRremote库进行红外信号发射和接收的时候出现的编译错误。完整错误信息如下图所示:
相关错误信息:
- Tone.cpp.o (symbol from plugin): In function `timer0_pin_port':
- (.text+0x0): multiple definition of `__vector_7'
- C:\Users\Administrator\AppData\Local\Temp\arduino_build_811807\libraries\IRremote\IRremote.cpp.o (symbol from plugin):(.text+0x0): first defined here
- collect2.exe: error: ld returned 1 exit status
- exit status 1
- 为开发板 Arduino/Genuino Uno 编译时出错。
解决方法:
刚开始的时候遇到错误首先是百度和QQ群中看有没有人遇到,因为一般正常开发的类库兼容性是很好的,而且IRremote类库是Arduino开发板的首选类库,使用人数很多。然而很多人的解决方案都是说该类库与系统定时器冲突,建议更换其他类库,或者修改定时器中断。
最终经过代码排查,我发现在我的项目中用了无源蜂鸣器播放了一段音乐,其中用到了tone()函数。尝试将播放音乐的代码注释掉之后,问题得以解决。
所以IRremote冲突的确实是定时器中断,而我的项目中与之冲突的则是系统函数tone(),所以最简单的方法就是注释掉tone()函数,用MP3播放模块来取代无源蜂鸣器。
如果你是一个技术控,那么可以继续向下追踪,要么修改掉IRremote库的定时器,要么重新通过代码建立新的定时器和中断。
这是两个思路,至于第二个,等我有时间了再仔细研究。