【问题标题】:Serial.println(Serial.available()); changing behavior of Arduino codeSerial.println(Serial.available());改变 Arduino 代码的行为
【发布时间】:2014-05-15 13:09:30
【问题描述】:

我的 Arduino 上有这段代码:

这些变量被定义为全局变量,像这样:

 #define arraySize 32        
 char inChar = '0';
 char inVariable[arraySize];
 byte index = 0;  
 byte inDigit;     
 int inNumber;

函数是这样定义的:

void checkSeriale(){
     while(Serial.available() > 0){
       Serial.println(Serial.available());
       inChar = Serial.read();
        if(inChar != ':' && index < arraySize-1 && inChar != ';'){
           inVariable[index] = inChar;
           index++;
           inVariable[index] = '\0';
        }else{
           break;
        }
     }

     if(inChar == ':'){ 
       index = 0;
       while(Serial.available() >0 && index < 10 && inChar != ';'){
         inDigit = Serial.read() - '0';
         inNumber = inNumber * 10;
         inNumber = inNumber + inDigit; 
         index++; 
       }
       cambioVariabiliSeriale(inVariable);
     }

     if(inChar == ';'){
       cambioVariabiliSeriale(inVariable);
       inNumber=0;
       inChar='0';
       index=0;
     }
}

checkSeriale() 函数在 Arduino loop() 中与其他一些函数循环,这些函数运行不影响任何这些变量的其他一些代码片段。

这个函数应该以两种形式从串口获取命令:

  1. variablename:variablevalue - 这应该将名为 variablename 的变量的值更改为新接收到的值。
  2. command; - 这应该只是运行一个外部函数来做其他事情。

函数读取接收到的数据,直到到达:;

如果它收到:,它会继续读取以获取值。然后将该值存储在inNumber 变量中,并将inVariable 传递给第二个函数cambioVariabiliSeriale(String inVariable),该函数检查inVariable 字符串等于什么变量名,并将inNumber 分配给与inVariable.

目前的代码似乎运行良好。每个接收到的信号(使用正确的语法)都会得到很好的处理。

但如果我尝试删除 Serial.println(Serial.available()); 行,代码将停止工作。 inNumber 现在总是包含 0

我不介意在代码中保留该行,但我认为执行该命令使代码保持工作很奇怪。

有人知道为什么那行会影响接收值的读取吗?

【问题讨论】:

    标签: c arduino embedded


    【解决方案1】:

    我尝试使用 in(见下文)中的一些虚拟值来运行您的代码,并且在注释掉该行的情况下它似乎运行正常,即 innumber 确实包含值。但是在完成它之后,我有点感觉我不理解你的逻辑。大致流程是这样吗:

    1. 使用 Serial.available 检查字符是否在串行接收缓冲区中

    2. 如果是这样,请执行以下三件事之一:

    a) 如果字符不是 ';'或 ':' 或数组中的最后一个字符,将其添加到 inVariable 数组中,增加索引计数器并将零添加到数组中

    b) 如果 char 是 ':',进行几次检查并从缓冲区中读取下一个 char 作为数字,然后对其进行处理,然后运行 ​​cambioVariabiliSeriale

    c) 如果 char 是 ';',则运行 cambioVariabiliSeriale 并重置一些索引。

    (另外,我认为当您在检查 inChar == ':' 的 if 语句中时,您不需要检查 if inChar != ';')

    不能这样运行,所以 Serial.println(Serial.available());可以注释掉没有效果吗?

    void checkSeriale(){
      while(Serial.available() > 0){
        Serial.println(Serial.available());
        inChar = Serial.read();
        if(inChar != ':' && index < arraySize-1 && inChar != ';'){
          inVariable[index] = inChar;
          index++;
          inVariable[index] = '\0';
        }
    
        else if(inChar == ':'){ 
          index = 0;
          while(Serial.available() >0 && index < 10){
            inDigit = Serial.read() - '0';
            inNumber = inNumber * 10;
            inNumber = inNumber + inDigit; 
            index++; 
          }
          cambioVariabiliSeriale(inVariable);
        }
    
        else if if(inChar == ';'){
          cambioVariabiliSeriale(inVariable);
          inNumber=0;
          inChar='0';
          index=0;
        }
      }
    }
    

    我将一堆串行监视器打印插入到您的原始代码中,以查看发生了什么 - 如果它对您有用,它就在这里。希望对您有所帮助!

    #define arraySize 32        
    char inChar = '0';
    char inVariable[arraySize];
    byte index = 0;  
    byte inDigit;     
    int inNumber;
    int i; //counter
    
    String repeatstring;
    
    void setup(){
      Serial.begin(9600);
    }
    
    void loop(){
      checkSeriale();
    }
    
    void checkSeriale(){
      while(Serial.available() > 0){
        pr("Start of 'checkSeriale' function");
        pr("Characters available in serial receive buffer: " + String(Serial.available()));
        //Serial.println(Serial.available());
        inChar = Serial.read();
        pr("Read a char into InChar: " + String(inChar));
        pr("Characters available after Serial.read(): " + String(Serial.available()));
        if(inChar != ':' && index < arraySize-1 && inChar != ';'){
          pr("First 'if' statement (inChar not equal to colon)");
          inVariable[index] = inChar;
          index++;
          inVariable[index] = '\0';
          for(i=0;i<sizeof(inVariable);i++){
            Serial.print(String(inVariable[i]));
          }
        }
        else{
          pr("Else statement for first 'if', inChar equals colon hence break");
          break;
        }
      }
      if(inChar == ':'){ 
        pr("Second 'if' statement (InChar is equal to colon)");
        index = 0;
        pr("Characters available in serial receive buffer: " + String(Serial.available()));
        while(Serial.available() >0 && index < 10 && inChar != ';'){
          inDigit = Serial.read() - '0';
          pr("Characters available after Serial.read(): " + String(Serial.available()));
          pr("inDigit: " + String(inDigit));
          pr("inNumber: " + String(inNumber));
          inNumber = inNumber * 10;
          pr("inNumber * 10: " + String(inNumber));
          inNumber = inNumber + inDigit; 
          pr("InNumber + inDigit : " + String(inNumber));
          index++; 
        }
        cambioVariabiliSeriale(inVariable);
      }
    
      if(inChar == ';'){
        pr("third 'if' statement (inChar is equal to semicolon)");
        cambioVariabiliSeriale(inVariable);
        inNumber=0;
        inChar='0';
        index=0;
      }
    
    }
    
    void cambioVariabiliSeriale(char test[]){
    }
    
    //simple debug technique - use pr("something"); in your code - askchipbug
    void pr(String txt){
      if(repeatstring != txt){
        //if the debug text is different, print it
        Serial.println(txt); //prints the text and adds a newline
        delay(1000); //just pauses the scrolling text for 1 second, make bigger if you want a longer pause
        repeatstring = txt;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多