我如何积累数据,直到它准备好通过串行发送
How do I accumulate data until it is ready to be sent over serial?
我试图通过串行创建一个与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。如果队列为空,则设置一个信号量(标志),以便打印函数可以重新加载循环队列。
- 什么时候在C++中返回常量引用是个好主意
- 使用准备好的语句大容量插入到postgresql
- 当 std::future 准备好被检索时发出信号主线程
- 使用 std::async 准备好后立即显示结果
- 如何确定网络堆栈何时准备好再次打开到同一主机/端口的套接字?
- clang的libc++生产准备好了吗?
- 多卷曲C++ 准备好时不断提供新的处理程序
- 可以跨线程共享准备好的语句
- 将数值绑定到准备好的sql的正确方法
- C++套接字从未准备好使用轮询进行写入
- MysqlC++驱动程序-创建后获取准备好的语句查询
- 如何在不使用准备好的OpenCv函数的情况下在c++中实现对图像的不锐利遮罩
- QSqlQuery:在执行之前获取准备好的语句字符串
- 我如何积累数据,直到它准备好通过串行发送
- Qt Qcamera未准备好
- SQLite 查询未准备好行,但为空值
- 在我准备好分配它之前,将“unique_ptr”保留为未设置:这就是我重新分配它的方式吗?
- 重新分配到尚未准备好的未来时会发生什么
- 通过libcouchbase-cxx发出准备好的/参数化的查询
- 在准备好的语句中使用多个"?"参数表