UART错误处理


8

由于大多数控制器的 UART 具有类似的体系结构,因此我不关注特定的MCU 。它们具有用于Tx和Rx的FIFO。

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

如何处理这些错误条件以正确地保持通信?

我确实知道这是一个模糊的问题,但是大多数时候人们对这样的错误发生时应该做的事情感到困惑,最终只是清除错误位。

Answers:


6

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

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

史蒂文(Steven)为您提供了一些不错的主意,该如何在更高的层次上解决。当您认为确实存在错误的机会并且数据完整性很重要时,通常会将数据块封装到带有校验和的数据包中。接收器针对每个正确接收的校验和发送一个ACK。

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


9

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


3

当接收到的UART数据中出现帧错误时,很有可能所有后续字节都将成为垃圾,直到根据数据传输模块,在数据线上连续下降沿之间有十个或更多位时间(十九位时间)之前,这是很可能的。间隔或连续标记的九位时间(所有标记中的最后一个将适用于所有UART)。如果一个人收到了一个帧正确的字节,其值是0x00或0x80(9位模式下为0x100),并且发送方没有发送长中断,或者接收方将停止尝试从发送方发送的任何长中断中解析字节,则可以请确保它是正确的,随后的字节也将是正确的。如果接收到一个值,其中低位有0-6个连续的“零”,其余位都已置位,

S =开始P =上一个字节数据s =停止D =当前字节-=空闲
0111111101000000011111-在线信号
Ps ------ SDDDDDDDDs ---:如发送器所预期(0x02)
SPPPPPPPPsSDDDDDDDDs-:收到时(0xC0)

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.