欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

Arduino的串口结束符及串口缓冲区

发布时间:2025/3/12 编程问答 51 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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");}} }

结果如下图,三个结论成立。

总结

以上是生活随笔为你收集整理的Arduino的串口结束符及串口缓冲区的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。