Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Serial.println(Serial.available());改变Arduino代码的行为_C_Arduino_Embedded - Fatal编程技术网

C Serial.println(Serial.available());改变Arduino代码的行为

C Serial.println(Serial.available());改变Arduino代码的行为,c,arduino,embedded,C,Arduino,Embedded,我的Arduino上有一段代码: 这些变量定义为全局变量,如下所示: #define arraySize 32 char inChar = '0'; char inVariable[arraySize]; byte index = 0; byte inDigit; int inNumber; 函数的定义如下: void checkSeriale(){ while(Serial.available() > 0){ Seria

我的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;
     }
}
void checkserial(){
while(Serial.available()>0){
Serial.println(Serial.available());
inChar=Serial.read();
if(inChar!=':'&&index0&&index<10&&inChar!=';')){
inDigit=Serial.read()-“0”;
inNumber=inNumber*10;
inNumber=inNumber+靛蓝;
索引++;
}
cambiovariabilibiliserial(不变);
}
如果(英寸==';'){
cambiovariabilibiliserial(不变);
inNumber=0;
inChar='0';
指数=0;
}
}
checkserial()
函数在Arduino
loop()
中循环,其他一些函数运行一些不影响这些变量的其他代码段

此函数应以两种形式从串行端口获取命令:

  • variablename:variablevalue
    -这应将名为variablename的变量的值更改为新接收的值
  • 命令-这应该只是运行一个外部函数来执行其他操作
    函数读取接收到的数据,直到它到达

    如果它收到一个
    ,它将继续读取以获取值。然后将该值存储在编号
    变量中,
    不变
    传递给第二个函数
    cabiovariabilitieserial(字符串不变)
    检查
    invariate
    字符串等于哪个变量名,并将
    inNumber
    赋值给与
    invariate
    同名的变量

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

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

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


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

    我试着用中的一些伪值来运行代码(见下文),并且在注释掉这一行后似乎运行正常,即innumber确实包含值。然而,经过努力,我有点感觉我不理解你的逻辑。这大概就是流程:

  • 检查串行接收缓冲区中的字符是否具有serial.available

  • 如果是,请执行以下三项操作之一:

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

    b) 如果字符是一个“:”,则进行两次检查并从缓冲区中读取下一个字符作为一个数字,然后对其进行处理,然后运行CambioVariabilitySeriale

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

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

    无法按如下方式运行,因此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;
        }
      }
    }
    
    void checkserial(){
    while(Serial.available()>0){
    Serial.println(Serial.available());
    inChar=Serial.read();
    if(inChar!=':'&&index0&&index<10){
    inDigit=Serial.read()-“0”;
    inNumber=inNumber*10;
    inNumber=inNumber+靛蓝;
    索引++;
    }
    cambiovariabilibiliserial(不变);
    }
    else如果(inChar==';'){
    cambiovariabilibiliserial(不变);
    inNumber=0;
    inChar='0';
    指数=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;
      }
    }
    
    #定义数组大小32
    字符英寸='0';
    字符不变[排列];
    字节索引=0;
    它的字节数;
    int inNumber;
    int i//柜台
    字符串重复字符串;
    无效设置(){
    Serial.begin(9600);
    }
    void循环(){
    checkserial();
    }
    void checkserial(){
    while(Serial.available()>0){
    pr(“开始‘检查序列’功能”);
    pr(“串行接收缓冲区中的可用字符:”+字符串(serial.available());
    //Serial.println(Serial.available());
    inChar=Serial.read();
    pr(“将字符读入InChar:+String(InChar));
    pr(“Serial.read()之后可用的字符:”+字符串(Serial.available());
    if(inChar!=':'&&index