如何解决Arduino中DallasTemperature库的‘yield’未声明作用域错误
解决DallasTemperature库中‘yield()’未声明的编译错误
这个错误的核心原因是编译器找不到yield()函数的定义——yield()是Arduino核心库提供的函数,用于在循环中释放资源给后台任务,但有些开发环境(比如旧版Arduino核心、自定义编译环境)可能没有自动引入包含该函数声明的头文件,而DallasTemperature 3.9.0版本的代码默认假设环境会支持这个函数,从而导致编译失败。
下面是几个可以快速解决问题的方案:
方案1:在你的代码开头添加Arduino核心头文件
这是最简单的解决方法,直接在现有代码最顶部引入Arduino.h,它包含了yield()的声明,让编译器能找到这个函数。修改后的代码如下:
#include <Arduino.h> #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 8 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature tempSensor(&oneWire); void setup() { Serial.begin(9600); } void loop() { tempSensor.requestTemperatures(); float temperatureC = tempSensor.getTempCByIndex(0); Serial.println(temperatureC); }
方案2:修改DallasTemperature库的源代码
如果方案1无效,你可以直接修改库文件来添加函数声明:
- 找到你本地的
DallasTemperature.cpp文件(路径就是你报错里的/home/myuser/sketchbook/libraries/DallasTemperature/DallasTemperature.cpp) - 在文件最顶部添加一行代码:
#include <Arduino.h>
或者也可以直接添加yield()的外部声明:
extern void yield(void);
保存后重新编译即可。
方案3:降级DallasTemperature库版本
DallasTemperature 3.9.0版本才引入了yield()的使用,如果你不想修改代码或库文件,可以尝试降级到3.8.0版本(这个版本没有使用yield()函数):
- 在Arduino IDE中打开库管理器,找到DallasTemperature库
- 选择“选择版本”,然后选中3.8.0并安装
- 重新编译你的代码
以上三个方案都能解决这个编译错误,优先尝试方案1,它最快捷且不需要修改库文件。
内容的提问来源于stack exchange,提问作者Stimou




