文章目錄
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"); } } }
結果如下圖,三個結論成立。