我如何积累数据,直到它准备好通过串行发送

How do I accumulate data until it is ready to be sent over serial?

本文关键字:准备好 何积累 数据      更新时间:2023-10-16

我试图通过串行创建一个与Arduino通信的快速协议。我这样做的主要目的是学习新的代码方法,所以这可能不是最优的。

我计划在内存中创建一个"虚拟Arduino",其中包含引脚状态和其他信息的数组。而不是发送每一个引脚变化作为单独的命令,我会对这个"虚拟Arduino"进行更改,然后只累积更改并发送这些。

举个例子,如果我更新Arduino的速度很慢,比如每0.1秒更新一次,我在这段时间里做了100次修改,我想把这些修改累加起来,然后一次把它们全部发送出去。

在我的例子中,我想创建一个缓冲区。这样,如果在等待serial完成前一个命令的发送期间发生了20个更改,它可以累积这些更改并在serial再次可用时一次性发送它们。

我已经有一个方法如何实际积累的变化:变化将作出一个数组表示引脚。

但是,我需要一个子例程,当serial再次可用时,它就发送这些更改。这在正常的顺序编程中是不会发生的,因为我不想让它等到我完成计算后再继续发送更改。我在想一个中断或者一个单独的线程。

如果我这样做:

while(1)
{
   if( SerialAvailable() )
        Send(changes);
   else
       -DO STUFF HERE-
}

的问题是,它不会发送更新,直到它完成了所有其他的。

在许多嵌入式系统中,有两种使用串行端口的方法:轮询和中断。在轮询中,程序检查一个状态位。在中断中,端口生成并中断,由中断服务例程(ISR)接管。

看起来你想要你的串行端口配置为中断时,发送寄存器为空。当发送寄存器为空时,发送中断服务程序可以获取累积的数据并通过端口发送。ISR也可以设置指示串口可用的信号量。

在我的嵌入式系统中,端口使用FIFO内存。当FIFO为空时触发中断。ISR从循环队列中重新加载FIFO。如果队列为空,则设置一个信号量(标志),以便打印函数可以重新加载循环队列。