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