两个 UARTS 如何知道使用哪个波特率?

电器工程 UART 发射机 接收者 波特率
2022-01-13 18:50:00

我正在阅读有关 UART 的标准协议,我认为如果接收 UART 不知道数据传输的波特率,就会有很多问题。如果假定的波特率低于传输数据的波特率,则接收 UART 将不会“看到”某些位。另一方面,如果接收器使用的波特率高于传输数据的波特率,则会有位会被计数两次,从而导致数据被错误地“读取”。

我对 UART 的了解是,当线路空闲时,它保持为“1”,开始位为“0”,停止位为“1”。另外,停止位为“1”与线路空闲时的“1”没有任何区别,或者有没有办法区分?

两个通信 UART 的第一个是否就他们将使用的波特率达成一致?如果是,他们是如何做到的?

3个回答

传统上,普通 UART 必须由人工预先配置所需的波特率(以及字长、停止位、奇偶校验等)。

几十年来,尽管在某些设置中发现了“自动波特”检测的实现,这通常通过定时波形的关键特征来推断波特率。早期版本需要传输已知字符,但更复杂的版本可能能够从更多任意数据中找到速率。

接收 UART 通常具有以更快速率运行的本地时钟 - 通常是波特率的 8 或 16 倍。这用于对输入信号进行采样,并以可以容忍百分之几错误的方式检测字中的位。即使是两个晶体振荡器也无法完美匹配速率,但误差容限允许使用一些不太精确的源,有时包括经过调整的片上振荡器等。它还可以帮助适应这样一个事实,即对流行的振荡器频率进行分频可能只会产生对某些波特率的不准确近似 - 在过去,UART 主时钟有时需要特定频率才能访问流行的波特率,例如 8051 系列上的 11.0592 MHz。

两个 UART 通过文档和操作员/用户手动设置波特率(包括握手协议、停止位大小等)“同意”波特率。

是的,一切都是手动设置的,这通常有点痛苦,特别是当系统文档记录不充分时(我正在看着你,每个嵌入式系统)。

我知道 USB、SATA 和大多数其他现代数据协议在一些重置或初始化事件后以最低速度使用一些标准化的默认配置启动,并与其他所有人(或只是主设备,取决于协议)协商以达到更高的速度. 有些人还在其数据/电源线上使用上拉或下拉电阻来指示支持的速度。

如果您有兴趣进一步研究其他协议,请参阅这个关于 USB 协商的网站。