处理 UART 错误

电器工程 UART
2022-02-03 20:21:27

我不专注于特定的 MCU,因为大多数控制器的 UART具有类似的架构。它们具有用于 Tx 和 Rx 的 FIFO。

UART 产生的最常见错误是:- 1. 帧错误 2. 奇偶校验错误 3. 溢出错误(Tx/Rx FIFO 溢出) 4. 接收中断错误(一些停止位错误)

应该如何处理这些错误条件以保持通信正常?

我确实理解这是一个模糊的问题,但大多数时候人们对发生此类错误时应该做什么感到困惑,最终只是清除错误位。

3个回答

这些错误无法修复,因此需要重新传输。这需要一些比 UART 更高级别的协议;您通常需要确认数据包的正确接收。该数据包可能是 1 个字节,但如果通信几乎没有错误,也可以使用更长的数据包。通过向发送器发送 ACK 来确认每个数据包,如果发生错误则发送 NACK。在后一种情况下,丢弃数据包并等待重传。
如果您使用数据包传输,您可能需要考虑 CRC 错误检查而不是奇偶校验,这不是很有效(每字节增加 1 位)并且只能捕获单个位错误。

要真正回答您的问题,我通常会丢弃收到的任何错误信息。这可能包括重新初始化 UART 硬件,具体取决于错误是什么以及 UART 硬件的详细信息。

唯一的例外是如果你想故意接受休息。这些显示为框架错误。在这种情况下,您将帧错误作为特殊条件传递到更高级别。但是,这需要将带外信息传递到更高级别,因此 UART 接收器接口不能被视为像获取字节流那样简单的东西。我想我在许多微控制器项目中只做过一次,因为它必须与故意使用中断的旧系统兼容。

史蒂文给了你一些好的想法,在更高的层次上应该怎么做。当您认为确实存在错误的可能性并且数据完整性很重要时,您通常会将数据块封装到带有校验和的数据包中。接收器为每个正确接收的校验和发送一个 ACK​​。

但是,绝大多数情况下,UART 错误不太可能发生,也不是绝对关键,您可以在高级别忽略它们。UART 硬件可以捕获的错误类型通常是由于操作员的愚蠢,而不是线路噪声。最像噪声会导致 UART 无法检测到的不良数据。因此,低级 UART 驱动程序会立即抛出与 UART 错误相关的任何内容,否则会继续将接收到的字节流传递到下一级。事实上,即使您使用数据包和校验和,它也会这样做,因为这比接收单个字节的级别更高。

当接收到的 UART 数据中存在帧错误时,所有后续字节都将成为垃圾的可能性很大,直到根据 UART,在数据线上的连续下降沿之间有 10 位或更多位时间,19 位时间连续间隔,或连续标记的九位时间(最后一个将在所有 UART 上工作)。如果接收到值为 0x00 或 0x80(9 位模式下为 0x100)的正确成帧字节,并且发送器不发送长间隔或接收器将停止尝试从发送器发送的任何长间隔中解析字节,则可以请确保它是正确的,随后的字节也将是正确的。如果接收到一个值,其中低位中有 0-6 个连续的“零”,并且其余位全部设置,

S=START P=prev byte data s=stop D=current byte - =idle
0111111101000000011111 -- 信号在线
Ps------SDDDDDDDDs--- :正如发送器所期望的(0x02)
SPPPPPPPPsSDDDDDDDDs- : 收到时 (0xC0)

如果每个数据包都以 0x00 开头,然后是 0xFF,则一个数据包上的帧错误不会影响下一个数据包。当接收方注意到成帧错误时,它可以开始丢弃数据,直到它看到一个正确成帧的 0x00,然后它就会知道它有一个合法的数据包开始。