异步通信协议是一种通信协议,其中数据在发送和接收之间不需要时钟同步。通信双方独立地控制数据的发送和接收。异步通信通常用于点对点的数据传输,其中数据流在没有共享时钟信号的情况下进行。

异步通信的基本原理

在异步通信中,数据以字节为单位传输,每个字节的传输都包含以下几部分:

  1. 起始位(Start Bit):在数据位之前传输,指示数据传输的开始。通常为1位。
  2. 数据位(Data Bits):实际传输的数据,通常为8位(1字节),有时为5到9位。
  3. 可选的校验位(Parity Bit):用于错误检测,通常是奇偶校验(例如奇校验、偶校验)。此部分不是必须的,可以选用。
  4. 停止位(Stop Bit):在数据位之后传输,指示数据传输的结束。可以是1位或2位。
  5. 空闲位:用于保持线路空闲状态(传输结束后的间隙)。

异步通信的特点

  1. 无时钟同步

  2. 通信双方在没有时钟信号的情况下通过约定的波特率来进行同步。发送和接收双方必须使用相同的波特率(即每秒钟传输的比特数)。
  3. 适用于短距离通信

  4. 由于没有时钟信号,异步通信适合于点对点的短距离通信。
  5. 简单性和低成本

  6. 由于没有时钟同步的需求,硬件和协议实现较为简单,适用于低成本、低复杂度的设备之间的通信。
  7. 适合不连续传输的应用

  8. 异步通信适用于不需要连续流的场景。数据发送可以不定期进行,接收方可以在空闲时间点读取数据。
  9. 数据传输效率相对较低

  10. 由于没有共享时钟,数据传输效率可能较低。每个数据单元都需要起始位和停止位来标识,导致传输过程中会有一定的开销。

异步通信的优缺点

优点
  • 简单性:通信过程不需要共享时钟信号,硬件实现相对简单,适合低成本设备。
  • 低成本:只需两根数据线(如TX、RX)进行通信,减少了线路和硬件成本。
  • 灵活性:能够支持不定时的数据发送,非常适合设备之间需要间歇性通信的应用。
  • 缺点
  • 同步问题:通信双方必须在相同的波特率下工作,否则数据可能会丢失或无法正确解码。
  • 效率较低:每个数据块都需要额外的起始位和停止位,使得数据传输的有效负载相对较低。
  • 常见的异步通信协议

    1. UART(通用异步收发器)

    2. UART是最常见的异步通信协议,通常用于串口通信。它使用两根线:一个发送(TX)线和一个接收(RX)线。每个数据传输使用起始位、数据位、校验位(可选)和停止位进行封装。
    3. 常见于嵌入式系统、PC与外设的串行通信(如调试接口、无线模块通信等)。
    4. RS-232

    5. RS-232标准是一种早期的串行通信标准,通常用于计算机与外设的异步通信。它定义了电气信号和通信协议,支持点对点连接,常见于串口通信接口中。
    6. USB(通用串行总线)

    7. 尽管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. 发送方准备数据:发送方将数据分割为字节,并在每个字节之前添加起始位和停止位。
    2. 数据位传输:每个数据位按照预定的波特率依次发送,通常是最少的1位先发送(LSB – 最低有效位),直到完整的字节传输完毕。
    3. 停止位传输:在数据位之后,发送方会发送一个或多个停止位,表示数据传输完毕,并且为接收方提供处理数据的时间。
    4. 重复过程:发送方继续传输下一个字节,直到所有数据都发送完毕。
    接收数据过程:
    1. 接收方检测起始位:接收方在空闲时(高电平)监听信号。一旦检测到信号从高电平跳变到低电平,就表示开始接收到数据(即接收到起始位)。
    2. 接收数据位:接收方按照预定的波特率同步接收每个数据位。通常是从最低有效位(LSB)开始接收,直到完整的字节接收完毕。
    3. 校验位(可选):如果使用校验位,接收方会检查接收到的校验位是否正确,来检测是否发生了数据传输错误。
    4. 接收停止位:接收方在接收完数据位后,还要等待一个或多个停止位,以确认数据帧的结束。
    5. 空闲等待:当一个数据帧处理完毕,接收方再次进入空闲状态,等待下一个数据的到来。

    4. 波特率(Baud Rate)

    波特率是异步通信中一个非常关键的概念,它决定了数据传输的速率,即每秒钟传输多少比特。发送方和接收方需要设置相同的波特率,这样接收方才能正确地解码接收到的数据。常见的波特率值有9600、19200、115200等。

    例如,波特率为9600表示每秒传输9600个比特。在9600波特率下,发送方每隔1/9600秒传输一个比特,接收方则根据这个时间间隔来同步接收数据。

    5. 缓冲和流控制

  • 缓冲:由于异步通信没有时钟信号,接收方通常会使用缓冲区来缓存接收到的数据,以便后续处理。接收方会根据接收到的数据帧来决定什么时候读取数据,并通过缓冲区管理数据流。

  • 流控制:流控制用于管理发送方和接收方的数据流速,防止数据丢失。常见的流控制机制有:

  • 软件流控制(XON/XOFF):通过发送特定的控制字符(XON表示继续传输,XOFF表示暂停传输)来管理数据流。

  • 硬件流控制(RTS/CTS):通过物理线路(如RTS/CTS)来通知发送方暂停或继续传输数据。
  • 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;

  • SBUF 是单片机的一个寄存器,用于进行串行数据的发送或接收。在发送数据时,SBUF 用来存储要发送的数据。
  • 这里将输入的 data (类型为 char)赋值给 SBUF,即将要发送的数据放入发送缓冲区。
  • 2. while (TI == 0);

  • TI 是一个串口控制标志位(Transmission Interrupt Flag,传输中断标志)。该标志位用于指示数据是否已经发送完成。
  • TI = 1 表示数据已经发送完成。
  • TI = 0 表示数据尚未发送完成。
  • while (TI == 0); 会让程序进入一个等待状态,直到 TI 标志位为 1,即直到数据发送完成。
  • 3. TI = 0;

  • 由于发送完一个字节数据后,TI 标志会被硬件自动置为 1,表示数据发送完成。在接下来发送另一个字节之前,需要手动将 TI 标志位清零,才能开始新的发送过程。
  • TI = 0; 这行代码是清除发送完成标志位,确保下一次发送操作能够顺利进行。
  • 接受数据

    char UART_Receive() {
        while (RI == 0);        // 等待数据接收
        RI = 0;                 // 清除接收标志
        return SBUF;            // 返回接收到的数据
    }
    

     

    作者:190043

    物联沃分享整理
    物联沃-IOTWORD物联网 » 单片机中异步通信

    发表回复