在我的一个项目中,我有一台纳米计算机(嵌入式Linux),它通过UART连接到微控制器。
两者都自己做一些处理,但有时纳米计算机需要在UART上发送数据,反之亦然。
我想,如果A想和B交流,B需要倾听,对吧?我怎么知道什么时候该听,什么时候该说?我是否需要在我的两个设备中都有一个专门的线程并行运行,只负责UART通信,而它们做其他事情?如果我错过了一条消息,是否有一个缓冲区可以在我准备好时读取?
谢谢你的建议。:)
‘A’和‘B’一直在听。您必须启用UART接收中断
也许这个链接将解释基础:UART基础
连接并正确初始化硬件在tx到rx两侧都有一个tx和rx。因此,双方一直在从硬件角度进行倾听。操作系统可能有一个驱动程序和一个缓冲区,它一直在积累输入。但是,如果你没有软件要求输入数据,那么你就看不到了。如果你愿意的话,你确实需要一些软件来监控uart(通常通过驱动程序和操作系统),这样你就可以在任何给定的时间看到对方发送的信息。如果需要的话,可以在连接的两端执行此操作。
使用了两种方法。
在过去,使用硬件流量控制是很常见的。这将在每个方向上使用一根额外的导线。发送器等待,直到导线指示接收器准备就绪。当接收器还没有准备好接收数据时,它会向另一侧发送信号。硬件将缓冲至少一个字节,如果缓冲区已满,则向另一方发出信号,不要通过这条线路发送。
这在今天已经不那么常见了。UART相对于现代硬件来说速度非常慢,而且大缓冲区非常便宜且易于提供,因此不再存在问题。发送器只填充接收器的硬件缓冲区,接收器周期性地清空硬件缓冲区。软件将不得不长时间忽略缓冲区,使其溢出。
中间解决方案是在数据流中使用流控制。通常,保留两个字符,一个用于停止流,另一个用于恢复流。如果发送方的缓冲区接近满,接收方将向发送方发送一个流控制字符,如果其缓冲区接近空,则另一个字符将发送给发送方。只有当数据流不需要处理二进制数据时,这才真正有用。这种情况极为罕见,传统上主要用于一端有人的连接。如果信息来得比你读的快,你也可以暂停流程
通常,所使用的协议容忍溢出,并且适当地包括某种形式的高级确认和/或重传。一个设备可能会等待另一方对其命令发送某种响应,如果没有收到响应,请重试该命令。该协议的设计目的是,如果一个命令被接收两次,它不会做任何可怕的事情,因为它可能是丢失的回复。