【发布时间】:2019-12-24 00:27:20
【问题描述】:
我试图在两个不同的函数中使用两个 switch case 语句通过串行包控制微控制器,但是其中一个函数没有切换,程序无限循环。其中一项功能根据enum进行切换:
enum class State {
example_a,
example_b,
example_c
};
void serialTask(State stateArg, ObjectA exampleA, ObjectB exampleB, ObjectC exampleC, ObjectD exampleD) {
switch (stateArg) {
case State::example_a:
Serial.println("Serial Task, example a");
exampleA.doSomething();
stateArg = State::example_a;
break;
case State::example_b:
Serial.println("Serial Task, example b");
exampleB.doSomething();
stateArg = State::example_b;
break;
case State::example_c:
Serial.println("Serial Task, example c");
exampleC.doSomething();
stateArg = State::example_c;
break;
}
};
我将所有其他对象作为参数提供给它,因为根据情况我会调用它们的函数或修改它们的成员。
另一个函数根据串口切换enum的值:
void stateSwitch(State stateArg) {
if (Serial.available()) {
uint8_t code = Serial.read();
switch (code) {
case 'a':
stateArg = State::example_a;
break;
case 'b':
stateArg = State::example_b;
break;
case 'c':
stateArg = State::example_c;
break;
}
};
他们后来在我的main.cpp 中被调用,如下所示:
ObjectA aObj;
ObjectB bObj;
ObjectC cObj;
ObjectD dObj;
volatile State stateObj;
void setup(){
stateObj = State::example_a;
Serial.begin(115200);
};
void loop(){
stateSwitch(stateObj);
serialTask(stateObj, aObj, bObj, cObj, dObj);
};
这是问题的简化版本,但它说明了重点。程序可以编译,但由于某种原因它不能跳出State::example_a。我在 PlatformIO 中使用带有 Arduino 框架的 Teensy 微控制器,这是 Visual Studio 的扩展。感谢您的帮助。
【问题讨论】:
-
其他参数是按值传递的(即作为调用者传递的副本),因此调用者看不到对它们的任何更改。将参数更改为引用或指针
标签: c++ arduino switch-statement