我对Arduino和C/C++非常陌生,所以请和我一起裸照。实际上,值得注意的是,虽然我使用的是Arduino IDE,但运行代码的设备是ESP8266。使用回调函数打破while循环的最佳方式是什么?
我确定我错误地构建了我的代码,但我不确定最好的方法,希望有人能指出我朝着正确的方向。
为了我的情况可以归结为一个简单的例子:
我的主循环()函数只是运行在各个循环中的回调()函数(PubSubClient MQTT)。这个回调函数首先设置一个全局布尔变量“跑”为false,然后会做1 3件事:
- 如果“1”被接收它会运行一个函数调用动作1()。
- 如果收到'2',它将运行一个名为action2()的函数。
- 如果接收到'3',它将打印一行到Serial。
- 如果收到其他东西或没有收到任何东西,它什么都不会做。
两个动作1()和动作2()函数是看起来像这样的循环:
void action1() {
run = true; // Do this once to start the loop
while (run == true) {
// Do some stuff
callback(); // To check for new messages
}
}
这里的问题:
如果动作1(运行)和回调( )收到'3'一切正常。回调会将“run”变量设置为false,将行打印到Serial,然后返回到action1()循环,该循环将中断并且整个事件返回到loop()。如果action1()正在运行,并且callback()接收到启动action2()的命令,则action2()将启动,action1()将暂停等待返回。
因此,我认为在action1()和action2()之间来回切换可能会导致内存问题,因为循环堆叠在一起。我看到设备崩溃,如果我足够做到这一点。我可能会回调()需要'排队'action1()或action2(),然后让主循环()运行它们吗?这样我们总是会回到主循环(),从而结束所有其他的循环。但我确定有更好的解决方案。
任何帮助,将不胜感激。
似乎'main'应该只有一个循环。回调应该返回一个介于0和3之间的值,让'main'处理剩下的部分。 – user3386109