UART 通常让您在 1、1.5 和 2 个停止位之间进行选择。1 个停止位有效负载效率为 80% (8/10),2 个停止位下降到 72.7% (8/11)。那么第二个停止位有什么好处呢?
一个或两个 UART 停止位?
额外的停止位可能是增加一点额外接收处理时间的有用方法,尤其是在高波特率和/或使用软 UART 时,其中需要时间来处理接收到的字节。
在速度很紧的情况下,并且您的 UART 仅提供 2 次方的分频比,添加一个额外的停止位可能是一种选项,可以使速度降低的幅度小于下一个最低波特率。
我相信这可能是 DMX512 标准指定 2 个停止位的原因之一。
它们可能有用的另一种情况是,如果您的设备在没有任何缓冲或打包的情况下转发数据流 - 节点之间的时钟速率和有限采样粒度的微小差异可能导致错误发生,因为数据被多个节点接收和重新传输一个链,但如果数据以 2 个停止位发送并且接收器设置为一个停止位,它会增加足够的余量来容纳这些错误,并为链下游的节点留下至少一个有效的停止位周期以可靠地接收。
我还遇到过一种情况,即很长的电缆运行导致上升和下降时间出现一些不对称,导致停止位长度不足 - 发送 2 个停止位并让接收器只需要一个固定这个。
在过去的日子里,打印机(几乎)是全机械结构。即使在那时,波特率也有些标准化,因此添加一个额外的停止位会给打印机一些额外的时间来打印字符。时间方面在当时更为明显。对于我的第一台打印机,嘈杂的http://en.wikipedia.org/wiki/Teletype_Model_33,我必须在发送回车后插入两个字符的暂停。
两个停止位不太可能比一个系统更有用电缆和/或没有调制解调器 - 调制解调器阶段。
2 个停止位为您提供更长的同步时间,更多的字符之间的处理时间,并且可能,根据硬件和算法,在连续数据流期间获得或重新获得同步的机会更大。与时钟速度较低且处理器吞吐量较低时相比,字符间时间在现代系统中的价值要小得多。
如果你有一个基本连续的数据流,那么如果不同步,任何高位都会看起来像一个停止位。任何高低转换看起来都像一个字节边界。如果您的接收器从 10 边界开始并且它不是真正的开始边界,那么这只会在 50% 的时间内被发现)(即,如果发现最后的“停止位”实际上是一个低数据位,您也会沿途跳过了真正的停止/开始边界。平均而言,您有 1/4 的可能性是字节边界为 1/0 并且错误地看起来像停止/开始对。以上建议,如果您选择错误的停止-开始配对,那么您可能有大约 50% 的机会在接下来的尝试中选择另一个。
如果您使用 2 个停止位 (11),则有效的停止开始序列是 110,它有 1/8 的机会出现在随机数据流量中。在非同步流中混合真正的停止位和启动位会稍微改变统计数据,但如果您在一个周期中获得错误的 110 停止/启动序列,那么您在遇到真正的 110 之前会再次尝试下一次尝试似乎相对不太可能接下来发生的顺序。
正如您所注意到的,1 个停止位产生 8/10 = 80% 的最大吞吐量,2 个停止位产生 8/11 = 72% 的效率。完全极限的吞吐量差异是 80%/72% =~ 11% 以上。这在极端情况下是一个有用的增益,但不是很大,如果电路空闲时间超过大约 10%,它的价值就很小。如果您的电路嘈杂且容易出现偶尔的同步丢失,那么额外的停止位可能会有很大帮助。但是,如果您非常关心吞吐量,您通常可以提高波特率(并非总是如此)或更改为完全同步操作。
为了放大 mikeselectricstuff 关于“软 UART”的接收时间的观点,一个接收应用程序总是知道何时接收数据并在轮询的基础上这样做,通常可以处理比中断驱动的软 UART 更快的波特率。然而,这样的应用程序只能在一个字节的停止位开始到下一个字节的开始位之间的时间内处理传入的数据。处理每个字节所需的时间最终成为通信速度的限制因素。在 115,200-N-8-2 处处理数据并不比在 57,600-N-8-1 处处理数据的要求高很多,但速度却快了 80% 以上。
有时,通过使用看似效率较低的数据格式,可以将事情推得更远。例如,可以将每个字节分成两份发送,一份七位,一份一份(一位部分的 MSB 均已设置)。如果这样做,即使只有一个停止位,在一个字节对的结尾和下一个字节对的开始之间也会有 8 位标记,因此可以将比特率推高到 4 倍只能使用两个停止位(并且是一个停止位的八倍)。尽管必须发送两倍多的字节,但数据速率提高四倍将是一个重大胜利。此外,虽然每个传输的字节对可用于发送 8 位数据,但编码将使用 256 个可能的字节值中的 130 个,