单片机中异步通信
异步通信协议是一种通信协议,其中数据在发送和接收之间不需要时钟同步。通信双方独立地控制数据的发送和接收。异步通信通常用于点对点的数据传输,其中数据流在没有共享时钟信号的情况下进行。
异步通信的基本原理
在异步通信中,数据以字节为单位传输,每个字节的传输都包含以下几部分:
- 起始位(Start Bit):在数据位之前传输,指示数据传输的开始。通常为1位。
- 数据位(Data Bits):实际传输的数据,通常为8位(1字节),有时为5到9位。
- 可选的校验位(Parity Bit):用于错误检测,通常是奇偶校验(例如奇校验、偶校验)。此部分不是必须的,可以选用。
- 停止位(Stop Bit):在数据位之后传输,指示数据传输的结束。可以是1位或2位。
- 空闲位:用于保持线路空闲状态(传输结束后的间隙)。
异步通信的特点
-
无时钟同步:
- 通信双方在没有时钟信号的情况下通过约定的波特率来进行同步。发送和接收双方必须使用相同的波特率(即每秒钟传输的比特数)。
-
适用于短距离通信:
- 由于没有时钟信号,异步通信适合于点对点的短距离通信。
-
简单性和低成本:
- 由于没有时钟同步的需求,硬件和协议实现较为简单,适用于低成本、低复杂度的设备之间的通信。
-
适合不连续传输的应用:
- 异步通信适用于不需要连续流的场景。数据发送可以不定期进行,接收方可以在空闲时间点读取数据。
-
数据传输效率相对较低:
- 由于没有共享时钟,数据传输效率可能较低。每个数据单元都需要起始位和停止位来标识,导致传输过程中会有一定的开销。
异步通信的优缺点
优点
缺点
常见的异步通信协议
-
UART(通用异步收发器)
- UART是最常见的异步通信协议,通常用于串口通信。它使用两根线:一个发送(TX)线和一个接收(RX)线。每个数据传输使用起始位、数据位、校验位(可选)和停止位进行封装。
- 常见于嵌入式系统、PC与外设的串行通信(如调试接口、无线模块通信等)。
-
RS-232
- RS-232标准是一种早期的串行通信标准,通常用于计算机与外设的异步通信。它定义了电气信号和通信协议,支持点对点连接,常见于串口通信接口中。
-
USB(通用串行总线)
- 尽管USB的工作模式主要是同步的,但USB也采用了一种异步传输机制,尤其是在数据包的传输和错误校验中,依赖发送设备和接收设备独立控制数据流。USB设备的通信依赖于主机进行控制,通常不会依赖严格的时钟同步。
异步通信的实现基于以下几个关键原理和机制:数据传输的独立性、起始位和停止位、以及波特率的匹配。在异步通信中,发送方和接收方并不共享时钟信号,而是依赖于预先约定的波特率来进行数据传输和同步。以下是详细的实现机制和步骤。
1. 没有共享时钟信号
与同步通信不同,异步通信不依赖于发送方和接收方之间共享的时钟信号。每个字节的传输由发送方自行控制时间间隔。接收方通过预定的波特率(即每秒钟传输的比特数)来解码数据。
2. 数据帧结构
在异步通信中,数据是以数据帧的形式传输的,每个数据帧通常包含以下几个部分:
起始位(Start Bit):表示数据帧的开始,通常为1位。起始位通常是0,因为在空闲状态下,信号线处于高电平(1),而起始位使信号从高电平变为低电平(0),从而引发接收方准备接收数据。
数据位(Data Bits):实际传输的数据,通常为5到9位,最常见的是8位(1字节)。
校验位(Parity Bit,可选):用于简单的错误检测。常见的校验方式有奇校验(Odd Parity)和偶校验(Even Parity)。它并不影响数据的传输,但帮助检测传输中的错误。
停止位(Stop Bit):表示数据帧的结束,通常为1位或2位。停止位是为了给接收方提供足够的时间来处理已经接收的数据,并为下一个数据帧做准备。
空闲位:在传输间隙中,线路恢复到空闲状态(通常为高电平)。
3. 传输过程
假设我们以**UART(通用异步收发器)**协议为例,来说明异步通信的具体实现过程。
发送数据过程:
- 发送方准备数据:发送方将数据分割为字节,并在每个字节之前添加起始位和停止位。
- 数据位传输:每个数据位按照预定的波特率依次发送,通常是最少的1位先发送(LSB – 最低有效位),直到完整的字节传输完毕。
- 停止位传输:在数据位之后,发送方会发送一个或多个停止位,表示数据传输完毕,并且为接收方提供处理数据的时间。
- 重复过程:发送方继续传输下一个字节,直到所有数据都发送完毕。
接收数据过程:
- 接收方检测起始位:接收方在空闲时(高电平)监听信号。一旦检测到信号从高电平跳变到低电平,就表示开始接收到数据(即接收到起始位)。
- 接收数据位:接收方按照预定的波特率同步接收每个数据位。通常是从最低有效位(LSB)开始接收,直到完整的字节接收完毕。
- 校验位(可选):如果使用校验位,接收方会检查接收到的校验位是否正确,来检测是否发生了数据传输错误。
- 接收停止位:接收方在接收完数据位后,还要等待一个或多个停止位,以确认数据帧的结束。
- 空闲等待:当一个数据帧处理完毕,接收方再次进入空闲状态,等待下一个数据的到来。
4. 波特率(Baud Rate)
波特率是异步通信中一个非常关键的概念,它决定了数据传输的速率,即每秒钟传输多少比特。发送方和接收方需要设置相同的波特率,这样接收方才能正确地解码接收到的数据。常见的波特率值有9600、19200、115200等。
例如,波特率为9600表示每秒传输9600个比特。在9600波特率下,发送方每隔1/9600秒传输一个比特,接收方则根据这个时间间隔来同步接收数据。
5. 缓冲和流控制
缓冲:由于异步通信没有时钟信号,接收方通常会使用缓冲区来缓存接收到的数据,以便后续处理。接收方会根据接收到的数据帧来决定什么时候读取数据,并通过缓冲区管理数据流。
流控制:流控制用于管理发送方和接收方的数据流速,防止数据丢失。常见的流控制机制有:
6. 误差检测
在异步通信中,由于没有同步时钟信号,错误检测是确保数据传输正确性的一个重要部分。常见的错误检测方法包括:
7. 异步通信的实现方式(以UART为例)
在许多嵌入式系统和微控制器中,UART(Universal Asynchronous Receiver-Transmitter)模块是实现异步通信的核心硬件。它负责将串行数据流转换为并行数据,并根据波特率、数据位、停止位等配置来进行数据传输。
例如,在51单片机中,使用UART进行串行通信的代码通常如下:
输出数据
void UART_Send(char data) {
SBUF = data; // 将数据放入发送缓冲区
while (TI == 0); // 等待发送完成
TI = 0; // 清除发送完成标志
}
1. SBUF = data;
data
(类型为 char
)赋值给 SBUF
,即将要发送的数据放入发送缓冲区。2. while (TI == 0);
while (TI == 0);
会让程序进入一个等待状态,直到 TI
标志位为 1
,即直到数据发送完成。3. TI = 0;
1
,表示数据发送完成。在接下来发送另一个字节之前,需要手动将 TI 标志位清零,才能开始新的发送过程。TI = 0;
这行代码是清除发送完成标志位,确保下一次发送操作能够顺利进行。接受数据
char UART_Receive() {
while (RI == 0); // 等待数据接收
RI = 0; // 清除接收标志
return SBUF; // 返回接收到的数据
}
作者:190043