为什么异步通信中的波特率需要相同?

电器工程 UART
2022-02-04 01:52:32

据我所知,TX 和 RX 引脚独立运行。另一方面,如果假设 MCU 和 PC 的波特率不同,我会通过实验得到垃圾读数。

有没有办法为非专家解释这一点?

4个回答

同步通信会有一条时钟线和一条数据线。这很容易:

  • TX 设置数据线上的数据,然后选通时钟线。
  • RX 等待时钟选通,然后读取数据。

波特率是多少并不重要,例如,它甚至可能在传输字节期间发生变化。

异步数据传输中没有时钟。这提出了一个问题。

假设我将使用手电筒向您发送消息。

  • 我们同意每条消息将是 8 位(一个字节)并且“light”=“1”和“dark”=0。
  • 我们决定发送的每个字节前面都有一个起始位 = '1'。(否则,例如,您将不知道“00001010”的传输何时开始。)
  • 我们现在需要同意闪存(波特)率。我们同意每比特 1 秒。
  • 你急切地等待着开始。当您看到第一个“1”时,您等待 1.5 秒,然后每隔 1 秒读取一次。

.

Data bits      S   0   0   1   0   1   1   1   1   Stop
               ___         ___     _______________
Data    ______|   |_______|   |___|               |___________

Read          `     ^   ^   ^   ^   ^   ^   ^   ^

图 1.时序图。

  • 最初 1.5 秒延迟的原因是因为我的时钟和你的时钟独立运行,可能存在计时错误。通过在每个位周期的中间读取读数,即使您的时钟运行速度比我的快或慢一点,您仍然可以获得良好的读数。时序误差会累积,最后一位将是最差的,但使用晶体控制的 TX 和 RX 电路,即使最后一位也应该足够准确地读取。

如果您选择以与我正在传输的速度不同的速度阅读我的闪光,那么您将阅读垃圾。


为了发送,要发送的数据字节被加载到发送寄存器中。在每次时钟转换时,最右边的位被传输,字节右移。这发生了八次,以便传输整个字节。

                      TX Buffer           Serial out
TX buffer initial     0 0 0 0 0 0 0 0       
TX data loaded        1 1 1 1 0 1 0 0       
Send start bit                              1
Send bit 0            . 1 1 1 1 0 1 0 -->   0
Send bit 1            . . 1 1 1 1 0 1 -->   0
Send bit 2            . . . 1 1 1 1 0 -->   1
Send bit 3            . . . . 1 1 1 1 -->   0
Send bit 4            . . . . . 1 1 1 -->   1
Send bit 5            . . . . . . 1 1 -->   1
Send bit 6            . . . . . . . 1 -->   1
Send bit 7            . . . . . . . . -->   1
Send stop bit         . . . . . . . .       0

图 2. 并行输入。串行输出。

对于接收器,时钟在接收到起始位后开始。在每个位的中间,数据被读取并移入数据接收锁存器。八个周期后,发出一个信号,指示数据字节已准备好读取。

                      Serial in     RX Buffer
Receive start bit        1          start the receive timing clock
Receive bit 0            0      --> 0 . . . . . . .
Receive bit 1            0      --> 0 0 . . . . . .
Receive bit 2            1      --> 1 0 0 . . . . .
Receive bit 3            0      --> 0 1 0 0 . . . .
Receive bit 4            1      --> 1 0 1 0 0 . . .
Receive bit 5            1      --> 1 1 0 1 0 0 . .
Receive bit 6            1      --> 1 1 1 0 1 0 0 .
Receive bit 7            1      --> 1 1 1 1 0 1 0 0
Receive stop bit         0          can be ignored
Receive data                       1 1 1 1 0 1 0 0

图 3. 串行输入。并行输出。

在两个通信系统 A 和 B 之间的典型情况下,有两个信号:

  • 一个从 A 的发送输出到 B 的接收输入
  • 一个从 B 的发送输出到 A 的接收输入

不同方向的速度一样吗?

除了简单之外,信号在两个方向上以相同的速率传输并没有什么特别的原因。许多计算机的硬件每个 UART 只有一个时钟,许多操作系统在系统调用中只允许一种速度。一些硬件和操作系统将允许它,

在某些情况下,它们不同是有意义的,因为工程将节省资金或提高整体交付性能。最值得注意的是,当前的 ADSL 互联网链接是这样的——“A”毕竟代表“不对称”——它们可能是 42 Mbit/秒“下行”和 18 Mbit/秒“上行”。从历史上看,一些系统的运行速度降低了 1200 位,提高了 75 位/秒。(例如MinitelViewdata。)这样的系统要求硬件能够做到这一点,并且是为两个方向上的信息量非常不同的情况而设计的:即请求网页所需的数据比接收它们需要的数据少得多。

发射器和接收器的速度相同吗?

以下仅描述一个方向

在异步串行链路中,发送器发送一个信号,然后使用自己的时序发送位。接收器看到开始信号并使用自己的时间来查看之后的位。没有两个时钟是绝对完全相同的,因此接收器的采样与发送器的发送至少会有点不同。允许多少?

对于非电子人员:我将通过塔上的特殊标志向您发送八个是/否答案。首先,我要升起旗帜,当我放下它时,你必须做好准备。我一放下它,就启动你的时钟:然后你有一个小时准备我的第一个答案。经过 1 小时的准备和 8 小时的回答后,您将得到我的八个答案。假设我的时钟非常准确,而你有一个蜡烛燃烧的时钟,它实际上需要一个多小时。真正的问题是,除非你去城堡的顶部,否则你看不到我的旗帜,而且你很懒,所以你每小时只看一次。为了确保您不必在雨中熬夜太久,您会在半小时内上山。

怎么会出错?

看看这个例子。如果你的时钟的“烛光时间”实际上用了 72 分钟,那么 8:30 的“烛光时间”实际上用了 10:12 的实际时间,我已经完成了发送。这是对此及其产生的错误的说明。发送方试图发送 01011000,但接收方错误地接收到 00110011。

在此处输入图像描述

它必须有多准确?

您可以看到,如果 8.5 个接收器时间段与 9 个发送器时钟周期一样长,则接收器将查看发送者的消息。在实践中,我们喜欢留有余地,并且只希望在中间 50% 的时间段内进行采样:所以限制是 8.5 次接收器时间 = 8.75 次发送器时间,准确度约为 3%。(但很多时候你设计得更准确,以防发件人也错了,在另一个方向。)

您可以看到,如果红色时钟比蓝色时钟快,您将遇到同样的困难。


笔记

在真正的 RS-232 通信中,首先发送最低有效位。如果它是作为 ASCII 发送的字母信息,这意味着“A”由 0x41 或 b:01000001 表示,它“向后”发送为 XYYYYYXY,其中 X 和 Y 是向上或向下极点、高电压和低电压等标志,最左边的先发送。如果您查看微控制器串行引脚上电压的示波器轨迹,您将看到与示例中的“旗杆高度”图完全相同的信号。如果您查看 RS-232 信号,则它是垂直镜像的。

如果您想详细了解事情的准确性,请参阅

通过降旗发出信号是真实的:时间同步信号是如何从大约 1833 年开始发送的。下图显示了皇家格林威治天文台的“时间球”。 在此处输入图像描述 图片来自维基媒体

“同步”意味着(在这种情况下)有一条单独的线路只携带一个时钟选通脉冲,告诉你“当这个信号变高时,测量你的 RX 线上的电压以获得一个值”。

异步通信中,没有这样的信号。相反,接收器只是观察 RX 信号的帧开始标记,然后简单地以固定间隔进行测量。

这些间隔必须与发送方使用的相同,否则接收方会测量同一位两次,或者在信号发生变化且尚未稳定时进行测量。

连续符号之间的周期是符号率的倒数,也称为波特率因此,发送器和接收器都必须以相同的波特率工作,否则无法进行通信。

嵌入式系统中的微控制器共享公共时钟波特率发生器,时钟来自同一个 cliyck 源(TI、Microchip、ST,我又看到了)。这将不允许系统以不同的波特率操作相同的 UART 端口。

为了解决这个问题:。

  1. 使用两个 UART 端口,一个用于发送,一个用于接收。根据需要使用不同的波特率(这样可以确保不会丢失帧)。

  2. 第二种选择取决于可行性。您可以以 Tx-Baud-rate 发送并快速更改波特率寄存器以以 RX-Baud-rate 接收,在接收之前将其更改为所需的 Tx-Baud-rate。如果这不是 Perfekt Handshake 通信,则存在数据丢失的风险(帧错误指示)。

  3. 软件串行选项(位爆炸)仅用于发送器和普通 UART 用于接收。

在此处输入图像描述