【问题标题】:How does UART communication work between two devices?两个设备之间的 UART 通信如何工作?
【发布时间】:2019-06-11 09:43:36
【问题描述】:

在我的一个项目中,我有一台通过 UART 连接到微控制器的纳米计算机(嵌入式 Linux)。

两者都自己做一些处理,但有时纳米计算机需要在 UART 上发送数据,反之亦然。

我想如果 A 想与 B 交流,B 需要倾听,对吧?我怎么知道什么时候听,什么时候说话? 我是否需要在我的两个设备中并行运行一个特殊线程,只负责 UART 通信,而他们做其他事情? 如果我错过了一条消息,是否有一个缓冲区已填满,我可以在准备好时读取?

感谢您的建议。 :)

【问题讨论】:

  • 在UART通信中,两个UART直接相互通信。发送 UART 将来自控制设备(如 CPU)的并行数据转换为串行形式,将其串行传输到接收 UART,然后接收 UART 将串行数据转换回并行数据以供接收设备使用。在两个 UART 之间传输数据只需要两条线。请阅读 UART 的工作原理。

标签: multithreading microcontroller communication uart


【解决方案1】:

使用了两种方法。

过去,通常使用硬件流控制。这在每个方向上都使用了一根额外的电线。发送方一直等待,直到线路指示接收方已准备好。当接收器没有准备好接收数据时,它会向另一端发出信号。硬件将缓冲至少一个字节,如果缓冲区已满,则通知另一端不要通过此线路发送。

这在今天不太常见。相对于现代硬件而言,UART 速度非常慢,而且大型缓冲区非常便宜且易于提供,因此不再存在问题。发送方只是填充接收方的硬件缓冲区,接收方定期清空硬件缓冲区。软件必须长时间忽略缓冲区才能溢出。

中间解决方案是在数据流中使用流控制。一般保留两个字符,一个停止流,一个恢复流。如果缓冲区接近满,接收方会向发送方发送一个流控制字符,如果缓冲区接近空,则发送另一个控制字符。这仅在数据流不需要处理二进制数据时才有用。这是极其罕见的,传统上主要用于一端有人类的连接。如果信息来得快于您阅读的速度,您也可以暂停信息流。

通常,使用的协议可以容忍溢出,并且包括某种形式的高级确认和/或适当的重传。一个设备可能会等待另一方对其命令发送某种响应,如果没有得到响应,则重试该命令。该协议的设计目的是在收到两次命令时不会做任何可怕的事情,因为它可能是丢失的回复。

【讨论】:

    【解决方案2】:

    正确连接和初始化硬件在 tx 到 rx 的两边都有一个 tx 和 rx。所以双方一直在从硬件的角度倾听。操作系统可能有一个驱动程序和一个一直在累积输入的缓冲区。但是,如果您没有要求输入数据的软件,那么您将看不到它。如果您愿意(通常通过驱动程序和操作系统),您确实需要一些监控 uart 的软件,以便您可以看到对方在任何给定时间发送的内容。如果需要,您可以在连接的两端执行此操作。

    【讨论】:

      【解决方案3】:

      “A”和“B”一直在听。您必须启用 UART 接收中断。
      也许这个链接会解释基础知识:UART basics

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-22
        • 2019-04-05
        • 2012-03-25
        • 2012-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多