Arduino的串口结束符及串口缓冲区
文章目錄
- 1.深入理解緩沖區(qū)和Serial.available():
- 2.深入理解串口結(jié)束符
- 3.驗證結(jié)論:
1.深入理解緩沖區(qū)和Serial.available():
運(yùn)行下面的代碼,我發(fā)現(xiàn)如果不在串口輸入任何數(shù)字,就會一直顯示“no”,輸入一個數(shù)字,就一直顯示“yes”。關(guān)掉串口界面再打開,還是一直顯示no
得出第一個結(jié)論:
輸入的字符并不會隨著輸入的結(jié)束而結(jié)束,他一直都存在于緩沖區(qū)。
由于arduino是通過loop函數(shù)不斷循環(huán)的,每一次的循環(huán)都很快,可能我們輸入的數(shù)據(jù)還沒有完全傳入arduino的串口緩沖區(qū),因此Serial.avaliable()的值在一開始可能并不能準(zhǔn)確顯示出緩沖區(qū)里的所有數(shù)據(jù)的字節(jié)數(shù)。
我們只能說,Serial.avaliable()的返回值是當(dāng)前緩沖區(qū)中接收到的數(shù)據(jù)字節(jié)數(shù),注意是當(dāng)前。
例子:
上述代碼的結(jié)果如下圖,可以看出,一開始雖然我們輸入四個字節(jié),但是緩沖區(qū)只收到三個字節(jié),進(jìn)行第二次循環(huán),緩沖區(qū)才完全接收到。
上述代碼我們又增加一個delay(1000)。此代碼的結(jié)果如下,可以看出,此時緩沖區(qū)第一次就讀取了所有輸入的字節(jié)
得出第二個結(jié)論:
Serial.avaliable()的返回值是當(dāng)前緩沖區(qū)中接收到的數(shù)據(jù)字節(jié)數(shù)。為了使它一次就捕獲到所有緩沖區(qū)中的數(shù)據(jù),我們通常需要加延時函數(shù)。
2.深入理解串口結(jié)束符
打開串口界面,會發(fā)現(xiàn)
那么這幾個選項分別是什么意思呢,又有什么不同呢?
首先我們需要知道Serial.read(),他是從緩沖區(qū)拿出一個字節(jié),先進(jìn)緩沖區(qū)的先被拿出來。
我們選擇沒有結(jié)束符,然后輸入五個數(shù)字,結(jié)果如下圖。從中我們可以發(fā)現(xiàn),讀到第五個數(shù)之后緩沖區(qū)已經(jīng)沒有數(shù)據(jù)了。
然后我們再分別選擇換行符和回車,從結(jié)果可以看出,此時我們輸入了五個,但實際上緩沖區(qū)有六個字節(jié),那么顯而易見,當(dāng)我們輸入五個數(shù),然后點發(fā)送,系統(tǒng)會自動增加一個換行符或回車作為最后一個數(shù)
好了,現(xiàn)在我們得出第三個結(jié)論,結(jié)束符是當(dāng)輸入完后系統(tǒng)自動添加到緩沖區(qū)中的字符。
3.驗證結(jié)論:
來驗證一下我們的三個結(jié)論:
我們輸入五個數(shù),如果說第一個輸出是六,那么三個結(jié)論成立
結(jié)果如下圖,三個結(jié)論成立。
總結(jié)
以上是生活随笔為你收集整理的Arduino的串口结束符及串口缓冲区的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pic pwm 占空比可调 源码_PIC
- 下一篇: (扩展欧几里得)青蛙的约会