Arduino:如何使用串行命令退出主循环中的循环?

Arduino: how to exit for loop in Main Loop with serial command?

大家好我是新来的! 我需要通过串行命令在 arduino 板上的主循环中退出 for 循环 运行,但看起来直到主循环结束时都没有考虑串行事件。关于如何解决的任何想法? 我放了一些简化的代码来更好地理解这个问题。

boolean start=false;
boolean abortLoop=false;
String inputString = "";

void setup() {
  Serial.begin(9600);
}

void loop() {
  if(start){
    Serial.println("start");
    for(int i =0; i <10; i++){
      if(abortLoop)break;
      Serial.println(i);
      delay(1000);
    }
    start=false;
    abortLoop=false;
  }
}

void serialEvent()
{
  while (Serial.available())
  {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    //Serial.println(inputString);
    // if the incoming character is a newline, set a flag
    // so the main loop can do something about it:
    if (inChar == '\n')
    {
      inputString = inputString.substring(0, inputString.length() - 1);
      //Serial.println(inputString);
      //Serial.println(inputString.length());
      if (inputString[0] == 's')
        {
          Serial.println("start");
          start = true;
        }
     if (inputString[0] == 'a')
      {
        abortLoop=true;
        Serial.println("abort");
      }
      inputString = "";
    }
  }
}

如果在循环中间发送命令a,循环会一直进行到结束。 结果是:

start
start
0
1
2
3
4
5
6
7
8
9
abort
abort

在这种情况下,命令被发送了 2 次。

解决方案非常简单。你唯一要做的就是在for循环中调用你的函数,否则函数无法执行。

 ...
for(int i =0; i <10; i++){
      serialEvent();
      if(abortLoop)break;
      Serial.println(i);
      delay(1000);
  }
 ...

而且我觉得如果你也在这里调用你的函数会更好:

 ...
void loop() {
  serialEvent();
  if(start){
 ...

奇怪的是没有必要,但在我看来它更好。并且 start 被打印了两次,因为你调用了它两次。来过一次:

void loop() {
  if(start){
    Serial.println("start");
    for(int i =0; i <10; i++){

还有一次在这里:

if (inputString[0] == 'a')
{
   abortLoop=true;
   Serial.println("abort");
}

所以你可以删除其中一个。