首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Serial.println(Serial.available());Arduino代码的变化行为

Serial.println(Serial.available());Arduino代码的变化行为
EN

Stack Overflow用户
提问于 2014-05-15 13:09:30
回答 1查看 540关注 0票数 0

我的Arduino上有一段代码:

这些变量被定义为全局变量,如下所示:

代码语言:javascript
复制
 #define arraySize 32        
 char inChar = '0';
 char inVariable[arraySize];
 byte index = 0;  
 byte inDigit;     
 int inNumber;

函数的定义如下:

代码语言:javascript
复制
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

我不介意在代码中保留这一行,但我认为执行该命令使代码工作正常是很奇怪的。

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

EN

回答 1

Stack Overflow用户

发布于 2014-05-19 15:39:13

我尝试使用一些虚拟值来运行您的代码(见下面),并且它似乎运行良好,行注释掉了,也就是说innumber包含值。然而,在经历了它之后,我感觉到我不理解你的逻辑。这是大致的流动:

  1. 检查字符在带有Serial.available的串行接收缓冲区中
  2. 如果是这样,那么做三件事中的一件:

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

( b)如果字符是“:”,执行两次检查,并将缓冲区中的下一个字符作为一个数字读取,然后对其执行一些操作,然后运行cambioVariabiliSeriale

c)如果字符是“;”,运行cambioVariabiliSeriale并重置一些索引。

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

这不能按以下方式运行,因此Serial.println(Serial.available());可以被注释掉而不产生效果?

代码语言:javascript
复制
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;
    }
  }
}

我在您的原始代码中插入了一系列Serial打印,以查看发生了什么--如果对您有任何用处,它就在这里。希望能帮上忙!

代码语言:javascript
复制
#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;
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23679215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档