image-20241205195439834

UART通讯协议(Universal Asynchronous Receiver/Transmitter)

通用异步接受/发送器—UART,是一种串行,异步,全双工通信协议。

串行(Serial)

定义: 数据以一位接一位的形式,在单条通道中按顺序传输。

特点:

数据从起点到终点逐位传输,而不是同时传输多位。只需要一条通信线或数据通道(外加控制线)。

异步(Asynchronous)

定义: 数据传输中,发送方和接收方的时钟无需同步

异步通信以一个字符为传输单位。通信中两个字符之间的时间间隔不固定,但同一字符中两个相邻位之间的时间间隔是固定的。一般来说,两个UART设备之间的通信不需要时钟线。此时,需要在两个UART设备上指定相同的传输速率,以及空闲位、起始位、奇偶校验位和结束位,即遵循相同的协议。

特点:

起始位和停止位:每组数据通常用起始位和停止位标志数据包的开始与结束。

无需共享时钟:双方时钟独立,但需要相同的波特率。

全双工(Full-Duplex)

定义: 数据可以同时双向传输,即发送和接收在同一时间内进行。需要两根独立的物理通道,一条用于发送数据,另一条用于接收数据。

数据传输速率以波特率表示,即每秒传输的位数。例如,如果数据传输速率为120个字符/秒,每个字符为10位(1个起始位、7个数据位、1个校验位、1个停止位),则其传输的波特率为10×120 = 1200 个bit/s = 1200 波特率。

数据通讯格式

image-20241205201406079

起始位

每次通信开始时,发送方发送一个逻辑“0”信号(VOL),表示传输字符的开始。由于总线空闲时为高电平,因此在开始通信时先发送一个与空闲状态明显不同的信号,即VOL。

数据位

起始位之后是我们要传输的数据。数据位可以是5、6、7、8、9位等组成一个字符(通常是8位)。如ASCII码(7位)、扩展BCD码(8位)。首先发送最低位,最后发送最高位。用低电平 表示“0”,高电平表示“1”,完成数据位的传输。

奇偶校验位

奇偶校验基于二进制码流中“1”的个数。发送方根据数据生成一个校验位,接收方通过重新计算来验证数据的完整性。

1. 奇校验(Odd Parity)
  • 定义:数据中所有“1”的个数(包括校验位)总是奇数。
  • 生成方法:
    • 如果“1”的个数已经是奇数,校验位为0
    • 如果“1”的个数是偶数,校验位为1
2. 偶校验(Even Parity)
  • 定义:数据中所有“1”的个数(包括校验位)总是偶数。
  • 生成方法:
    • 如果“1”的个数已经是偶数,校验位为0
    • 如果“1”的个数是奇数,校验位为1

奇偶校验的示例

数据位:1011001
  1. 奇校验:
    • 数据中“1”的个数:4(偶数)。
    • 校验位为:1
    • 最终传输数据:10110011
  2. 偶校验:
    • 数据中“1”的个数:4(偶数)。
    • 校验位为:0
    • 最终传输数据:10110010

校验过程

  1. 发送方
    • 根据数据计算校验位。
    • 将数据和校验位一起发送。
  2. 接收方
    • 接收数据后重新计算奇偶性。
    • 比较计算结果和校验位:
      • 若一致:数据可能正确。
      • 若不一致:检测到错误。

优点

  1. 实现简单,资源占用低。
  2. 能检测单比特错误。

缺点

  1. 无法纠错:仅能检测错误,无法判断错误发生在哪一位。
  2. 局限性:无法检测到偶数个比特翻转错误(例如两个“1”变成“0”或相反)。
  3. 误判概率:错误未被检测的概率较高。

停止位

它是字符数据的结束标记。它可以是 1 位、1.5 位或 2 位 VOH。由于数据在传输线上是定时的,并且每个设备都有自己的时钟,所以在通信时两个设备之间很可能会出现小的不同步。因此停止位不仅表示传输的结束,而且还为计算机提供了纠正时钟的机会。停止位越多,数据传输越稳定,但数据传输速度越慢。

协议层

在协议层中,规定了数据包的内容,由起始位、主要数据、校验位和停止位组成。双方的数据包格式必须约定一致,才能正常发送和接收数据。

image-20241205204131725

字段 长度 描述
STX 1 字节 消息开始标识符(固定为 0xFE)。
Length 1 字节 消息负载部分的长度(不包括头部和校验和)。
Sequence 1 字节 序列号,用于跟踪消息的顺序。
System ID 1 字节 标识系统的 ID,通常是无人机或地面站。
Component ID 1 字节 标识系统中不同组件的 ID,如飞行控制器、GPS 模块、传感器等。
Message ID 1 字节 消息类型标识符,用于标识不同类型的消息(如飞行状态、遥控指令等)。
Payload 可变长度 数据负载部分,包含具体的传输数据。
Checksum 2 字节 校验和,用于验证数据传输的完整性。

错误状态

1. 帧错误(Frame Error)

原因:帧错误通常发生在接收到的数据与预期的帧结构不匹配时。例如,如果数据位的数量不对或缺少停止位,就会发生帧错误。

可能原因:数据位长度设置不正确。停止位缺失或错误。接收方的接收时钟和发送方的发送时钟不同步。

解决方法:确保发送和接收双方的帧格式一致(如数据位、停止位和奇偶校验位等)。检查串口波特率是否匹配。

2. 溢出错误(Overrun Error)

原因:溢出错误发生在接收缓冲区满时,接收到的新数据无法存入缓冲区。

可能原因:接收方处理速度太慢,数据到达的速率超过了缓冲区的处理能力。串口配置的波特率过高,导致接收方无法及时读取数据。

解决方法:提高接收方的处理速度,减少数据的读取时间。降低波特率,以确保数据接收的稳定性。使用更大的接收缓冲区,减少丢包的风险。

3. 奇偶校验错误(Parity Error)

原因:奇偶校验错误发生在接收到的数据与设定的奇偶校验不一致时。

可能原因:数据传输过程中发生了位翻转,导致校验和错误。发送和接收双方的校验位配置不同(例如一个使用偶校验而另一个使用奇校验)。

解决方法:确保发送方和接收方使用相同的奇偶校验设置(偶校验、奇校验或无校验)。检查通信线路和电气连接,确保没有噪声干扰。

4. 接收缓冲区溢出(Receive Buffer Overflow)

原因:当接收数据的速率高于处理速率时,接收缓冲区可能会溢出,导致数据丢失。

可能原因:数据接收速率过快,接收端无法及时处理数据。系统负载过高,无法及时读取接收到的数据。

解决方法:降低串口的波特率。优化接收端的处理算法,确保数据尽可能快地被处理。使用较大的缓冲区以容纳更多数据。

5. 发送缓冲区溢出(Transmit Buffer Overflow)

发送缓冲区溢出发生在发送数据的速率超过了 UART 控制器能够处理的速率。

可能原因:数据发送速率过快,导致缓冲区被填满。发送方无法及时将数据从缓冲区传输到 UART。

解决方法:降低波特率或发送速率。增加硬件或软件缓冲区的大小,以适应高数据传输量。在发送端加入流控制(如 XON/XOFF 或 RTS/CTS)来调节数据流量。

6. 线路噪声(Noise Error)

线路上的电气噪声可能会干扰数据传输,导致数据错误。

可能原因:串口线路中存在高频噪声源。电源不稳定或电磁干扰(EMI)影响了串行通信。

解决方法:使用更高质量的屏蔽线缆来减少外部干扰。在设备中加入滤波器以减少噪声。采取差分信号传输(如 RS-485)来减少噪声的影响。

7. 数据丢失(Data Loss)

数据丢失可能发生在接收方无法及时处理所有传入数据时,导致缓冲区中的一些数据丢失。

可能原因:接收方的处理能力不足,无法及时读取和处理数据。高速数据传输时缓冲区的溢出。

解决方法:增加接收方处理能力,优化数据处理流程。采用流控制协议(如 XON/XOFF 或 RTS/CTS)来控制数据流量。

UART、I2c 和 SPI

协议 复杂度 传输速度 设备数量 线数 复式 主从数量
UART 简单的 最慢 最多 2 台设备 1 全双工 单对单
I2C 轻松链接多个设备 比 UART 更快 最多 127 个,但变得复杂 2 半双工 多个从机和主机
SPI 随着设备的增加而复杂 最快的 很多,但变得复杂 4 全双工 1个主站,多个从站