我很难理解这一点。搜索后我发现了
设置一个特定的字节以缓冲,直到调用serialEvent()为止
这是来自处理网站的this link
串行事件是一种功能,如果我没有记错的话,用户可以通过输入定义为该功能的串行端口来声明。
但是我见过bufferUntil(‘\n’)
,什么都没有发送给Serial,那么这是怎么做的?在调用serialEvent()之前,这是什么意思?将其放置在安装程序中如何在每次功能?而且我也看到过类似lf
这样的参数,所以这里发生了什么,以及它如何与serialEvent()函数协同作用?
感谢您的帮助,欢呼!
答案 0 :(得分:1)
使用bufferUntil(lf)
,您可以设置串行端口以侦听(将数据写入其缓冲区),直到获得某个字符(lf,在示例中链接为换行字符)为止。
您已经注意到bufferUntil(lf)
实际上不会读取任何数据。要读取端口接收的数据,您需要定义一个中断函数,在其中调用readString
:
void serialEvent(Serial port)
{ inString = port.readString(); }
一旦串行端口接收到您用bufferUntil(lf)
定义的字符,该函数将自动被调用(中断程序的正常流程并因此中断其名称);直到示例的换行符为止。从端口缓冲区读取数据后,您的程序将返回到被中断的任何地方。
编辑:什么是缓冲区?缓冲区可以是软件(存储在所使用的库中的变量)或硬件(串行端口芯片上的一堆内存),用于存储进入端口的数据(这是接收缓冲区,但是还有一个用于通过端口发送的信息的传输缓冲区。
将其视为位或字节的存储桶。打个比方,水龙头流出水,如果您想喝杯水,可以打开水龙头并在其下放一个玻璃杯。但这可能是您以后要喝水,因此您可以放置一个水桶(水缓冲器)为您储存水。在这种情况下,bufferUntil(lf)
语句就是放置水桶的动作,您可以将serialEvent
视为从水桶取水的动作(使用水桶这一事实使您可以以保持您在屋子周围的工作,但在某个时候铲斗会溢出,除非您关闭水龙头或开始清空水龙头,并且这样做必须打断正常的活动流程。
我们为什么需要缓冲区?好吧,您可能会不断轮询(从软件的主要任务监听端口),但是这样您的代码将效率很低。使用缓冲区,您可以做其他事情(计算东西,从传感器读取数据等),并且只有在确定(因为例程被中断)想要的数据在那里时,才检查端口。在这种情况下,您需要的数据将在bufferUntil(lf)
函数中用您用作参数的字符表示。
我希望我不要过度强调类比。