在 Arduino 的 setup() 之外调用构造函数的问题
Problem with calling constructor outside the setup() in Arduino
我有一个 OLED SPI 显示器 128x64,我使用 Adafruit_GFX 和 Adafruit_SSD1306 来控制它。我有一个 class 名称引擎,它有一个 public 构造函数,如下所示:
Engine::Engine() {
display.begin(2U, 0U, true, false);
// Define some pinmode not a problem
pinMode(button1Pin, INPUT_PULLUP);
pinMode(button2Pin, INPUT_PULLUP);
pinMode(xPin, INPUT);
pinMode(yPin, INPUT);
pinMode(buzzerPin, OUTPUT);
//clear the screen and display
clearScreen();
display.display();
time = 0;
}
然后在我的 .ino 文件中我有这样的东西:
Engine engine = Engine();
void setup() {
Serial.begin(115200);
Serial.println("testing...");
}
问题是程序有点死机。我不知道代码是否有效(我认为不是)。我试着调试它,如果我在安装程序中声明了引擎,那就没问题了。或者,如果我删除行 display.begin()
并将声明保留在设置之外。为什么?我需要在 setup()
中调用 display.begin()
吗?如何摆脱这个?
P.S:我为此使用了visual micro。但是后来我把代码移到Arduino上,问题还是出现了。
您需要将该构造函数拆分为两部分。现在你的构造函数正在用硬件做一些事情,比如调用 pinMode。但是,如果您在调用 setup 之前在全局范围内调用它,那么它将在 main 调用 init() 并设置硬件之前被调用。基本上,您在电路板准备好设置 pinMode 之前调用 pinMode。您需要做的是将所有硬件内容分离到 class 中的 begin() 或 init() 方法中,您可以调用表单设置。构造函数应该做的就是初始化任何需要它的变量并构造对象。一旦硬件准备好 运行,您应该有 engine.begin() 可以从设置中调用它来执行所有的 pinMode 和硬件操作。查看您的 lcd 代码如何使用 begin 方法。
我有一个 OLED SPI 显示器 128x64,我使用 Adafruit_GFX 和 Adafruit_SSD1306 来控制它。我有一个 class 名称引擎,它有一个 public 构造函数,如下所示:
Engine::Engine() {
display.begin(2U, 0U, true, false);
// Define some pinmode not a problem
pinMode(button1Pin, INPUT_PULLUP);
pinMode(button2Pin, INPUT_PULLUP);
pinMode(xPin, INPUT);
pinMode(yPin, INPUT);
pinMode(buzzerPin, OUTPUT);
//clear the screen and display
clearScreen();
display.display();
time = 0;
}
然后在我的 .ino 文件中我有这样的东西:
Engine engine = Engine();
void setup() {
Serial.begin(115200);
Serial.println("testing...");
}
问题是程序有点死机。我不知道代码是否有效(我认为不是)。我试着调试它,如果我在安装程序中声明了引擎,那就没问题了。或者,如果我删除行 display.begin()
并将声明保留在设置之外。为什么?我需要在 setup()
中调用 display.begin()
吗?如何摆脱这个?
P.S:我为此使用了visual micro。但是后来我把代码移到Arduino上,问题还是出现了。
您需要将该构造函数拆分为两部分。现在你的构造函数正在用硬件做一些事情,比如调用 pinMode。但是,如果您在调用 setup 之前在全局范围内调用它,那么它将在 main 调用 init() 并设置硬件之前被调用。基本上,您在电路板准备好设置 pinMode 之前调用 pinMode。您需要做的是将所有硬件内容分离到 class 中的 begin() 或 init() 方法中,您可以调用表单设置。构造函数应该做的就是初始化任何需要它的变量并构造对象。一旦硬件准备好 运行,您应该有 engine.begin() 可以从设置中调用它来执行所有的 pinMode 和硬件操作。查看您的 lcd 代码如何使用 begin 方法。