如何在微控制器中创建 UART Pass through

Posted

技术标签:

【中文标题】如何在微控制器中创建 UART Pass through【英文标题】:How create UART Pass through in Microcontroller 【发布时间】:2016-09-16 18:26:51 【问题描述】:

我正在尝试为我的一个项目创建一个 UART Pass through。但我不知道应该如何连接微控制器的引脚。我正在使用嵌入式 C 和 Keil 进行编程。

    为此,我正在使用 NXP p89lpc954 微控制器(基于 8051)。

    我的需求如下图所示

    我正在通过 UART 端口控制传感器。在正常操作下,微控制器程序使用 UART-1 端口与传感器通信。但是当我将微控制器 UART-0 端口连接到主机时,我希望主机通过在 UART-0 和 UART-1 之间创建通道来直接与传感器通信。

任何人都可以建议我们如何实现这一目标。

【问题讨论】:

Stack Overflow 上有很多人才,但我认为你会在其他地方得到更好的答案。你可以试试Electrical Engineering Stack Exchange,当你有编程和开发问题时再回到 Stack Overflow。我对这个话题了解得不够多,但它似乎有点宽泛,而且在 Stack Exchange 网络这样的法定人数上可能无法回答。 @jww : ... 除了这个是软件问题,Vinod 认为是硬件问题。 不清楚为什么电脑不能直接连接到传感器。您可以使用硬件来解决谁与它说话。为什么数据必须通过微控制器? 【参考方案1】:

通常不可能将一个 UART 直接透明地连接到另一个。您必须提供适当的软件才能将数据从一个 UART 传输到另一个。

如果两个 UART 以相同的波特率运行,这可能相对简单 - 您可以从一个 UART 读取 Rx 寄存器并将值写入另一个 UART 的 TX 寄存器(双向通信反之亦然)。如果您使用 UART 中断处理程序来实现这一点,它对 MCU 上运行的其他代码或多或少是透明的。要使其在没有缓冲的情况下工作,您必须确保可以在发生硬件溢出之前将数据从一个 UART 传输到另一个 - 您的硬件可能有也可能没有 FIFO,因此硬件缓冲可能与 Rx 一样少寄存器和输入移位寄存器(两个字节)。如果发生其他软件操作可能会干扰此操作,您可能仍需要缓冲。

如果波特率不同,您将需要至少为两个端口中较慢的端口提供缓冲,并且您将无法将数据从快速端口流式传输到慢速端口 - 必须有暂停防止缓冲区耗尽的数据流。

在某些设备上,使用 DMA 传输可能会显着降低软件开销(我想这不太可能)。

无论如何,您仍然需要软件来启用和配置 UART - 没有纯硬件或简单的“pin-pin”直通解决方案。

【讨论】:

@dwelch :顾名思义,在异步通信中,小时钟不匹配实际上不是问题。接收器在每个起始位上同步,使用它来确定下一帧的采样点(数据位、可选奇偶校验位、停止位),因此即使时钟速率不匹配多达 +/-5%,也可以进行流式传输对于 10 位 N,8,1 帧 - 接收器仅以发送器的 帧速率 运行。有问题的两个 UART 在相同微控制器中,因此(很可能)时钟域,因此可能不需要缓冲以实现相同的波特率。 实际上,它们具有相同的时钟这一事实并不一定意味着它可以在没有缓冲的情况下工作。如果发送器运行速度稍快一些,但仍在接收范围内,则它每单位时间可以产生比 MCU 在其正确定时的想法下可以重新发送更多的字符。但是,如果传入管道保持满状态,即使缓冲也无法解决问题,因为缓冲区最终会溢出。当然,大多数应用程序不会让管道一直保持满状态,而是会出现大量数据,其中之间存在间隙。 @ChirsStratton :我再解释一下:停止位是重新同步下一帧的时间,它本质上是一个强制间隙。 UART 在起始位的前沿重新同步,并将采样点设置为到达下一帧的每个位的标称中心。 UART 采样时钟比比特率运行得更快,通常为 5 倍,以便在比特中心的 10% 以内,从而提供宽比特率不匹配容限。 您仍然错过了这个问题。 UART 可以正常接收 - 问题在于它的接收速度比发送速度快,因此可能会出现重传跟不上接收的情况。 @ChrisStratton :啊 - 是的,我承认这一点。如果数据流无限期地进行,那么再多的缓冲也无法解决这个问题。它将延长不匹配的流突发的持续时间。如果 UART 包含一个 FIFO,根据数据流的性质,它可能在没有软件缓冲的情况下就足够了。我们不知道传感器的性质,但 UART 连接的设备使用连续流而不是周期性突发是不寻常的,但确实需要考虑突发长度和时序不匹配。【参考方案2】:

我建议查看 UART 配置寄存器或路由寄存器中是否有 UART 直通位。除此之外,我只会使用从 PC UART 到传感器 UART 的飞线。

【讨论】:

以上是关于如何在微控制器中创建 UART Pass through的主要内容,如果未能解决你的问题,请参考以下文章

LPC2138微控制器之I2C

微控制器的环形缓冲区

如何在不同的视图控制器中创建插座?

如何在控制器中创建目录 - laravel

如何在 iPad 的视图控制器中创建多个表格视图?

如何通过按下图像导航到另一个 UIView 控制器(之前在情节提要中创建)