两个UART如何知道要使用的波特率?


14

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

我对UART的了解是,当线路空闲时,线路保持为'1',起始位为'0',而停止位为'1'。另外,当线路空闲时,停止位为“ 1”与“ 1”没有任何区别还是有区别的方法吗?

两个通信UART的第一个是否同意使用哪种波特率?如果是,他们将如何做?


同样地,“停止位”也可以称为“返回空闲状态”,但是通过稍作设置,它具有定义的最小长度,但是在保证的最小时间之后,线路将一直保持“ 1”状态。下一个角色出现。
彼得·贝内特

他们可以随机更改通用波特率,直到XD起作用为止。
Bradman175 '16

3
Hayes通过在命令开始时使用字符序列“ AT”来启动一种方法,以使其调制解调器中的UART设置与与之通信的终端相同的波特率。通常,这不是由UART解码的,而是由实时固件解码的,该固件随后将UART配置为接收其余的命令行。它基本上检测了起始位的宽度以及奇偶校验的设置方式。
2013年

@infix因此,如果我打算为UART修改或创建Verilog代码,我可以做到这一点,以便它可以检测到此“ AT”序列并从那里调整其波特率?我正在考虑以最高波特率对其进行初始化,以便捕获所有内容,然后从中找到“ AT”序列。
Batibot323 '16

在汽车工业中经常看到的基于UART的通信协议(称为LIN)具有自动波特率检测机制,但是主节点和从节点在数据长度和停止位长度方面仍然“必须”匹配。这意味着仅检测波特率是不够的。
RohatKılıç16年

Answers:


26

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

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

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


2
我对自动波特率检测的假设可以是计时器和计数器同时工作以找到边沿和边沿之间的时间吗?
ammar.cma

1
问题在于,没有一种算法可以获取任意的“ uart串行”波形并可靠地确定波特率。您可以轻松地找到转换之间的最短时间,但这并不代表一个位周期。
彼得·格林

确实存在一种算法(我在许多地方都听说过这种算法称为“自动波特率”),但是当在UART芯片的资源受限范围内实现时,有时唯一的方法就是使用一些已发送的数据并将其用于校准,该校准将在会话的其余部分中持续存在。这通常是不希望的。如果用软件完成并且允许一点延迟,那么至少对于低速通信(小于200KB / s),不消耗数据(通过临时存储以进行分析)而做到这一点很简单。更高的速度带来了进一步的困难。
Wossname

8

两个UART通过文档并由操作员/用户通过人工设置波特率来“同意”波特率,包括握手协议,停止位大小等。


1
.....对于接口的两端。
Michael Karas

2

是的,一切都是手动设置的,这通常会有些麻烦,尤其是在系统文档记录不充分的情况下(我正在寻找您,每个嵌入式系统都在看)。

我知道USB,SATA和大多数其他现代数据协议会在某些重置或初始化事件后以最低速度以某种标准化默认配置启动,并与其他所有人(或仅主机,具体取决于协议)进行协商以提高速度。有些人还在其数据/电源线上使用上拉或下拉电阻来指示支持的速度。

如果您有兴趣进一步研究其他协议,请访问USB协商访问网站。

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.