_serial_.bufferUntil(byte)的作用是什么,它如何与serialEvent协同工作?

时间:2019-06-23 22:23:02

标签: bluetooth byte processing

我很难理解这一点。搜索后我发现了

  

设置一个特定的字节以缓冲,直到调用serialEvent()为止

这是来自处理网站的this link

串行事件是一种功能,如果我没有记错的话,用户可以通过输入定义为该功能的串行端口来声明。

但是我见过bufferUntil(‘\n’),什么都没有发送给Serial,那么这是怎么做的?在调用serialEvent()之前,这是什么意思?将其放置在安装程序中如何在每次功能?而且我也看到过类似lf这样的参数,所以这里发生了什么,以及它如何与serialEvent()函数协同作用?

感谢您的帮助,欢呼!

1 个答案:

答案 0 :(得分:1)

使用bufferUntil(lf),您可以设置串行端口以侦听(将数据写入其缓冲区),直到获得某个字符(lf,在示例中链接为换行字符)为止。

您已经注意到bufferUntil(lf)实际上不会读取任何数据。要读取端口接收的数据,您需要定义一个中断函数,在其中调用readString

void serialEvent(Serial port)
   { inString = port.readString(); } 

一旦串行端口接收到您用bufferUntil(lf)定义的字符,该函数将自动被调用(中断程序的正常流程并因此中断其名称);直到示例的换行符为止。从端口缓冲区读取数据后,您的程序将返回到被中断的任何地方。

编辑:什么是缓冲区?缓冲区可以是软件(存储在所使用的库中的变量)或硬件(串行端口芯片上的一堆内存),用于存储进入端口的数据(这是接收缓冲区,但是还有一个用于通过端口发送的信息的传输缓冲区。

将其视为位或字节的存储桶。打个比方,水龙头流出水,如果您想喝杯水,可以打开水龙头并在其下放一个玻璃杯。但这可能是您以后要喝水,因此您可以放置​​一个水桶(水缓冲器)为您储存水。在这种情况下,bufferUntil(lf)语句就是放置水桶的动作,您可以将serialEvent视为从水桶取水的动作(使用水桶这一事实使您可以以保持您在屋子周围的工作,但在某个时候铲斗会溢出,除非您关闭水龙头或开始清空水龙头,并且这样做必须打断正常的活动流程。

我们为什么需要缓冲区?好吧,您可能会不断轮询(从软件的主要任务监听端口),但是这样您的代码将效率很低。使用缓冲区,您可以做其他事情(计算东西,从传感器读取数据等),并且只有在确定(因为例程被中断)想要的数据在那里时,才检查端口。在这种情况下,您需要的数据将在bufferUntil(lf)函数中用您用作参数的字符表示。

我希望我不要过度强调类比。