在准备好通过串行发送之前,如何累积数据?

时间:2014-06-25 17:09:35

标签: c++ serial-port arduino

我试图通过串口创建一个与Arduino通信的快速协议。我的主要目的是学习新的代码方法,因此这可能不是最佳的。

我打算创建一个虚拟的Arduino"在内存中,它有针脚状态和其他信息的数组。我不会将每个引脚更改作为单独的命令发送,而是对这个" vitual Arduino"进行更改,然后只会累积更改并发送它们。

所以,例如,如果我真的很慢地更新Arduino,比如每0.1秒,并且我在那段时间内做了100次更改,我想在那之间累积这些更改并立即发送它们。

就我而言,我想制作一个缓冲区。这样,如果在等待串行完成发送上一个命令时发生20次更改,它可以累积这些更改并在串行再次可用时立即发送它们。

我已经有了一种如何实际累积更改的方法:将对表示引脚的数组进行更改。

但是,我需要一个子程序,只要串口再次可用就会发送这些更改。它不会发生在正常的顺序编程中,因为我不希望它等到我完成计算某些事情并继续发送更改。我想的是中断或单独的线程。

所以,如果我做了这样的事情:

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

问题是,在完成所有其他操作后,它才会发送更新。

1 个答案:

答案 0 :(得分:0)

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

看起来您希望串行端口配置为在发送寄存器为空时中断。发送中断服务程序可以获取累积的数据,并在发送寄存器为空时通过端口发送。 ISR还可以设置一个信号量,表示串口可用。

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