Arduino的串口結束符及串口緩沖區 分析研究


文章目錄
1.深入理解緩沖區和Serial.available():
2.深入理解串口結束符
3.驗證結論:


1.深入理解緩沖區和Serial.available():
運行下面的代碼,我發現如果不在串口輸入任何數字,就會一直顯示“no”,輸入一個數字,就一直顯示“yes”。關掉串口界面再打開,還是一直顯示no
得出第一個結論:
輸入的字符並不會隨着輸入的結束而結束,他一直都存在於緩沖區。

void setup(){
  Serial.begin(9600);
}
void loop(){
  
  if(Serial.available()>0){

    Serial.println("yes");

  }
  else {
    Serial.println("no");
  }
}

由於arduino是通過loop函數不斷循環的,每一次的循環都很快,可能我們輸入的數據還沒有完全傳入arduino的串口緩沖區,因此Serial.avaliable()的值在一開始可能並不能准確顯示出緩沖區里的所有數據的字節數。
我們只能說,Serial.avaliable()的返回值是當前緩沖區中接收到的數據字節數,注意是當前。
例子:

void setup(){
  Serial.begin(9600);
}
void loop(){
  if(Serial.available()>0){
    //delay(1000);
   Serial.println(Serial.available());
    delay(1000);
    Serial.println("yes");
  }
  else {
    Serial.println("no");
  }
}

上述代碼的結果如下圖,可以看出,一開始雖然我們輸入四個字節,但是緩沖區只收到三個字節,進行第二次循環,緩沖區才完全接收到。

void setup(){
  Serial.begin(9600);
}
void loop(){
  if(Serial.available()>0){
    delay(1000);
   Serial.println(Serial.available());
    delay(1000);
    Serial.println("yes");
  }
  else {
    Serial.println("no");
  }
}

上述代碼我們又增加一個delay(1000)。此代碼的結果如下,可以看出,此時緩沖區第一次就讀取了所有輸入的字節。

得出第二個結論:
Serial.avaliable()的返回值是當前緩沖區中接收到的數據字節數。為了使它一次就捕獲到所有緩沖區中的數據,我們通常需要加延時函數。

2.深入理解串口結束符

打開串口界面,會發現

 

那么這幾個選項分別是什么意思呢,又有什么不同呢?
首先我們需要知道Serial.read(),他是從緩沖區拿出一個字節,先進緩沖區的先被拿出來。

void setup(){
  Serial.begin(9600);
}
void loop(){
  if(Serial.available()>0){
    delay(2000);
    Serial.println("yes");
    char inchar= Serial.read();
    if(Serial.available()>0){
      Serial.println("yes2");
    }
    else{
       Serial.println("no2");
    }
  }
}

我們選擇沒有結束符,然后輸入五個數字,結果如下圖。從中我們可以發現,讀到第五個數之后緩沖區已經沒有數據了。

 

然后我們再分別選擇換行符和回車,從結果可以看出,此時我們輸入了五個,但實際上緩沖區有六個字節,那么顯而易見,當我們輸入五個數,然后點發送,系統會自動增加一個換行符或回車作為最后一個數。

 

好了,現在我們得出第三個結論,結束符是當輸入完后系統自動添加到緩沖區中的字符。

3.驗證結論:

來驗證一下我們的三個結論:
我們輸入五個數,如果說第一個輸出是六,那么三個結論成立

void setup(){
  Serial.begin(9600);
}
void loop(){
  if(Serial.available()>0){
    delay(2000);
  Serial.println(Serial.available());
    Serial.println("yes");
    char inchar= Serial.read();
    if(Serial.available()>0){
      Serial.println("yes2");
    }
    else{
       Serial.println("no2");
    }
  }
}

結果如下圖,三個結論成立。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM