据我所知,TX 和 RX 引脚独立运行。另一方面,如果假设 MCU 和 PC 的波特率不同,我会通过实验得到垃圾读数。
有没有办法为非专家解释这一点?
据我所知,TX 和 RX 引脚独立运行。另一方面,如果假设 MCU 和 PC 的波特率不同,我会通过实验得到垃圾读数。
有没有办法为非专家解释这一点?
同步通信会有一条时钟线和一条数据线。这很容易:
波特率是多少并不重要,例如,它甚至可能在传输字节期间发生变化。
在异步数据传输中没有时钟。这提出了一个问题。
假设我将使用手电筒向您发送消息。
.
Data bits S 0 0 1 0 1 1 1 1 Stop
___ ___ _______________
Data ______| |_______| |___| |___________
Read ` ^ ^ ^ ^ ^ ^ ^ ^
图 1.时序图。
如果您选择以与我正在传输的速度不同的速度阅读我的闪光,那么您将阅读垃圾。
为了发送,要发送的数据字节被加载到发送寄存器中。在每次时钟转换时,最右边的位被传输,字节右移。这发生了八次,以便传输整个字节。
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 之间的典型情况下,有两个信号:
除了简单之外,信号在两个方向上以相同的速率传输并没有什么特别的原因。许多计算机的硬件每个 UART 只有一个时钟,许多操作系统在系统调用中只允许一种速度。一些硬件和操作系统将允许它,
在某些情况下,它们不同是有意义的,因为工程将节省资金或提高整体交付性能。最值得注意的是,当前的 ADSL 互联网链接是这样的——“A”毕竟代表“不对称”——它们可能是 42 Mbit/秒“下行”和 18 Mbit/秒“上行”。从历史上看,一些系统的运行速度降低了 1200 位,提高了 75 位/秒。(例如Minitel和Viewdata。)这样的系统要求硬件能够做到这一点,并且是为两个方向上的信息量非常不同的情况而设计的:即请求网页所需的数据比接收它们需要的数据少得多。
以下仅描述一个方向
在异步串行链路中,发送器发送一个信号,然后使用自己的时序发送位。接收器看到开始信号并使用自己的时间来查看之后的位。没有两个时钟是绝对完全相同的,因此接收器的采样与发送器的发送至少会有点不同。允许多少?
对于非电子人员:我将通过塔上的特殊标志向您发送八个是/否答案。首先,我要升起旗帜,当我放下它时,你必须做好准备。我一放下它,就启动你的时钟:然后你有一个小时准备我的第一个答案。经过 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 端口。
为了解决这个问题:。
使用两个 UART 端口,一个用于发送,一个用于接收。根据需要使用不同的波特率(这样可以确保不会丢失帧)。
第二种选择取决于可行性。您可以以 Tx-Baud-rate 发送并快速更改波特率寄存器以以 RX-Baud-rate 接收,在接收之前将其更改为所需的 Tx-Baud-rate。如果这不是 Perfekt Handshake 通信,则存在数据丢失的风险(帧错误指示)。
软件串行选项(位爆炸)仅用于发送器和普通 UART 用于接收。
