Answers:
为了真正回答您的问题,我通常会丢弃收到的任何错误消息。这可能包括重新初始化UART硬件,具体取决于它是什么错误以及UART硬件的详细信息。
唯一的例外是如果您想故意收到休息时间。这些显示为取景错误。在这种情况下,您可以将成帧错误传递给更高级别的特殊条件。但是,这需要将带外信息传递到更高级别,因此UART接收器接口不能像获取字节流那样简单。我认为我在许多微控制器项目中都做过一次,因为它必须与故意使用中断的旧系统兼容。
史蒂文(Steven)为您提供了一些不错的主意,该如何在更高的层次上解决。当您认为确实存在错误的机会并且数据完整性很重要时,通常会将数据块封装到带有校验和的数据包中。接收器针对每个正确接收的校验和发送一个ACK。
但是,绝大多数时候UART错误不太可能发生,而且也不是绝对关键的,因此您可以从较高的层次上忽略它们。UART硬件可以捕获的错误类型通常是由于操作员的愚蠢而不是线路噪声引起的。最喜欢的噪声会导致不良数据,而UART无法检测到该数据。因此,低级UART驱动程序会立即抛出与UART错误相关的任何内容,否则将继续将接收到的字节流传递到下一级。实际上,即使您使用的是数据包和校验和,它也会这样做,因为这样做比接收单个字节的级别更高。
当接收到的UART数据中出现帧错误时,很有可能所有后续字节都将成为垃圾,直到根据数据传输模块,在数据线上连续下降沿之间有十个或更多位时间(十九位时间)之前,这是很可能的。间隔或连续标记的九位时间(所有标记中的最后一个将适用于所有UART)。如果一个人收到了一个帧正确的字节,其值是0x00或0x80(9位模式下为0x100),并且发送方没有发送长中断,或者接收方将停止尝试从发送方发送的任何长中断中解析字节,则可以请确保它是正确的,随后的字节也将是正确的。如果接收到一个值,其中低位有0-6个连续的“零”,其余位都已置位,
S =开始P =上一个字节数据s =停止D =当前字节-=空闲 0111111101000000011111-在线信号 Ps ------ SDDDDDDDDs ---:如发送器所预期(0x02) SPPPPPPPPsSDDDDDDDDs-:收到时(0xC0)
如果每个数据包均以0x00开头,后跟0xFF,则一个数据包的成帧错误不会影响下一个数据包。当接收方注意到成帧错误时,它可以开始丢弃数据,直到看到正确帧化的0x00,这时它将知道它具有合法的数据包开始。