【问题标题】:How to exit a 'for' loop while serial.available in Arduino如何在 Arduino 中的 serial.available 时退出“for”循环
【发布时间】:2014-05-26 17:13:08
【问题描述】:

背景:我正在使用与 PC 和 XBee + Arduino(也是传感器)连接的 XBee。我想从 PC 向 Arduino 端发送命令。 Arduino端将获取命令并发送传感器数据。

现在的问题:我希望 Arduino 继续发送数据(当前传感器数据 - 所以它的值可能会改变),如果没有来自 PC 端的命令,假设 20 次。我的意思是,如果在发送 5 个传感器数据后,Arduino 看到 PC 有另一个命令,它必须停止发送传感器数据;它将从 PC 获取新命令,读取它然后再次开始发送。

我的要求是Arduino在收到PC端的命令后会发送传感器数据,并会持续发送20次,但同时如果有新的命令,它会停止发送传感器数据,将读取命令然后再次开始发送传感器数据20次。如何编写代码,以便在每个循环中检查是否有来自 PC 的任何命令?

我知道下面的代码甚至不适合我正在寻找的内容:

void loop()
{
    while (Serial.available()) {
        delay(2);
        char c = Serial.read();
        readString += c;
    }
    if (readString.length() >0) {
        Serial.println(readString);
        for (int i=0; i<20; i++) {
            //Send the temperature, or send a simple message
            Serial.println("The command has been received");
        }
    }
}

【问题讨论】:

    标签: c for-loop arduino xbee


    【解决方案1】:

    while 循环和 delay() 调用没有帮助。假设 PC 发送 START 命令以启用温度采样,并 STOP 命令告诉它停止更新它们。您需要一个 bool 变量来指示状态。像这样的:

    bool sendTemperatures;
    String readString;
    
    void executeCommand(String cmd)
    {
        if (cmd == "START") sendTemperatures = true;
        else if (cmd == "STOP") sendTemperatures = false;
        // etc...
        else Serial.println("Bad command");
    }
    
    void checkSerial()
    {
        if (!Serial.available()) return;
        char c = Serial.read();
        if (c == '\n') {
            executeCommand(readString);
            readString = "";
        }
        else readString += c;
    }
    
    void sendSensorData() 
    {
        // etc..
    }
    
    
    void loop() 
    {
        checkSerial();
        if (sendTemperatures) sendSensorData();
    }
    

    【讨论】:

      【解决方案2】:
      String recievedData;  //readString
      
      void setup() {
        Serial.begin(9600);
      }
      
       void loop() {
      
        if (Serial.available() > 0) {
         recievedData = Serial.readString();//read full recieved data 
         Serial.println(recievedData);
      
          for (int i = 0; i < 20 && Serial.available() <= 0; i++) {
           //Send the temperature, or send a simple message
          }
         }
       }
      

      【讨论】:

        猜你喜欢
        • 2021-07-12
        • 1970-01-01
        • 2022-01-09
        • 2022-01-26
        • 2019-10-21
        • 2011-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多