定义

通用异步接收器/发送器 (UART) 属于一种硬件功能,通过使用 RS232、RS422、RS485 等常见异步串行通信接口来处理通信时序要求和数据帧。

  • UART 是实现不同设备之间全双工或半双工数据交换的一种常用且经济的方式。
  • 发送(TX) 接收(RX)
  • TXRX交叉连接
  • 没有时钟信号来同步数据
  • 添加停止位和起始位来识别
  • 两个 UART 端口必须以相似的波特率运行
  • 不支持多主/从,仅支持2个设备
  • 在普通的嵌入式MCU里,UART使用的电平是TTL电平,而在PC中的UART使用的则是RS232电平。
  • 串行通信由每个 UART 控制器的有限状态机 (FSM) 控制。

波特率

自适应波特率

发一个0x55过去检测对端波特率

0x55、0xAA这些数据刚好是01010这样的,刚好可以计算出位的发送时长 0x55 LIN协议的同步场,也是用来测波特率的

帧格式

Start Bit

UART 数据传输线在不传输数据时通常保持在高电压电平。 要开始传输数据,发送 UART 将传输线从高电平拉至低电平一个时钟周期。 当接收 UART 检测到高电压到低电压的转换时,它开始以波特率的频率读取数据帧中的位。

Data Frame

通常先传输最低有效位LSB

例如: 如果我们要以 7 位 ASCII 发送大写字母“S”,则位序列为 1 0 1 0 0 1 1。我们首先反转位的顺序,将其按最低有效位顺序排列,即 1 1 0 0 1 0 1,然后再发送它们。发送最后一个数据位后,使用停止位结束帧,线路返回空闲状态。

  • 7 位 ASCIIS’ (0x52) = 1 0 1 0 0 1 1
  • LSB 顺序 = 1 1 0 0 1 0 1

Parity Bits

奇偶性描述了数字的偶数或奇数。奇偶校验位是接收 UART 判断数据在传输过程中是否发生变化的一种方式。电磁辐射、不匹配的波特率或长距离数据传输可能会改变位。

Stop Bits

为了发出数据包结束信号,发送 UART 将数据传输线从低电压驱动到高电压,持续 1 到 2 位持续时间。

CTS RTS

流控主要是解决收发双方速度不匹配的问题。当接收端接收到的数据处理不过来时,就向发送端发送不再接收的信号,发送端接收到这个信号之后就会停止发送,直到收到可以继续发送的信号再继续发送。流控可以控制数据传输的进度,进而防止数据丢失。

硬件流控

硬件流控需要除 RX 和 TX 之外额外增加两根控制线, 一根叫 CTS(Clear To Send),为输入信号; 一根叫 RTS(Require To Send), 为输出信号。 这两根线一个是接收控制,一个是发送控制。低电平说明可以发送数据,高电平代表发送端需要等待。

软件流控

软件流控是在发送的数据中插入特殊的字符 XON(0x11) 和 XOFF(0x13) 来控制传输。通过插入 XOFF 强制停止发送器发送数据,通过插入 XON 强制发送器发送数据。

优化

大量数据通信

1. 基本概念

  • DMA:直接将数据从外设(如串口RX)传输到内存,无需CPU介入,提高效率。
  • 空闲中断:当串口接收缓冲区中的数据被完全读取,进入空闲状态时触发的中断,用于标记数据接收完毕。

2. 配置步骤

  • DMA配置 选择DMA通道:为串口接收分配一个DMA通道。 配置DMA参数: 传输大小:设置为接收缓冲区的大小。 源地址:串口的接收寄存器地址。 目标地址:内存中的缓冲区地址。 传输模式:设置为循环模式,以便在接收缓冲区满后自动重置传输计数器,实现连续接收。 优先级:根据需求设置。
  • 串口配置
  • 中断配置 使能空闲中断:在串口初始化时,确保空闲中断被使能。 中断服务程序(ISR):编写中断服务程序处理空闲中断。
  • 清除空闲标志。 在ISR中调用或设置标志,通知主循环数据已准备好处理。
  • 回调函数 接收事件回调:使用HAL_UARTEx_RxEventCallback来处理数据接收事件,可以在这里移动数据或处理数据。

3. 数据处理逻辑

  • 环形缓冲区:在主循环或回调中使用环形缓冲区管理数据,确保连续接收而不丢失数据。
  • 数据分包:识别数据帧的边界,可能是基于特定的帧头或帧尾,确保数据的正确解析。

串口空闲中断

串口空闲中断的触发条件是在串口接收完一帧数据后进入空闲状态时。

  • 具体来说,当串口接收缓冲区中的最后一个有效数据被读取,且在随后没有新的数据输入,导致串口进入一个无数据接收的状态,即空闲状态,此时会触发空闲中断。
  • 这个状态的检测依赖于串口控制器内部的空闲检测机制,通常是在连续接收字符的间隔中检测到一个字符停止位后的足够长的高电平(对于UART,即逻辑1状态)时间段。

  • 自动帧识别:空闲中断意味着一帧数据的完整接收,不需要额外的帧头帧尾检查逻辑。系统可以立即响应中断,知道一整帧数据已经被完整接收到,从而简化了数据包的边界判断。
  • 高效处理不定长数据:对于不定长的数据包,通过预先定义的帧结构(如特定的帧结束标志)进行解析可能需要复杂的逻辑和多次判断。空闲中断自动标识数据接收的结束,简化了协议解析的复杂度。
  • 简化软件设计:通过空闲中断,软件可以集中处理数据处理逻辑,而不是分散在每个字符的接收中断中,使得代码更加清晰和易于维护。

空闲中断

本质是确认帧截止,或者帧间隔。

不适用于流式协议,比较适合嵌入式场景典型的消息或者数据包通信,有明确的帧的概念,就需要帧停止检测。

DR Register

在串口通信中,将数据赋值给DR(Data Register)寄存器能实现发送,是因为STM32等微控制器的串行通信模块(如USART或UART)设计了一套自动化的数据传输机制。

DR寄存器的作用

  • DR寄存器是串口模块中的核心部件之一,它实际上是一个双功能寄存器,包含发送数据寄存器(TDR)和接收数据寄存器(RDR)。
  • 向DR寄存器写入数据时,实际上是向TDR部分写入数据,这个过程是透明的,用户无需直接区分这两个寄存器。

数据传输流程

  • 写入操作:当你通过程序将一个字节或多个字节的数据写入DR寄存器时,这些数据首先被存储在发送数据寄存器TDR中。
  • 自动移位:一旦数据被写入TDR,串口模块会自动开始工作。它会将TDR中的数据位一位地移出到TX(Transmit)引脚上,按照设定的波特率进行串行化传输。
  • 控制逻辑:串口控制器内部的时序发生器控制数据的发送速率,确保数据以正确的时序发送出去。同时,发送过程中的起始位、数据位、奇偶校验位(如果启用)和停止位都会被自动添加。
  • 状态反馈:在数据发送过程中,相关状态寄存器(如USART_SR)的TXE(发送数据寄存器为空)位会被硬件置1,表明发送缓冲区已空,可以接受新的数据。同时,如果配置了中断,发送完成时会产生中断请求。
  • CPU解耦:这种机制使得CPU在数据开始发送后就可以执行其他任务,无需持续监控发送状态,提高了效率。当发送完毕,通过中断或轮询方式,CPU可以得知并准备下一次发送或处理其他任务。

物理层

UART协议定义的数据链路层的数据帧格式,而RS232、RS485等通信接口定义的是物理层标准,即电平标准。

  • 通用异步接收器/发送器 (UART) 属于一种硬件功能,通过使用 RS232、RS422、RS485 等常见异步串行通信接口来处理通信时序要求和数据帧。UART 是实现不同设备之间全双工或半双工数据交换的一种常用且经济的方式。
  • UART 还可以用作红外数据交换 (IrDA) 或 RS485 调制解调器。

电平标准

  • 数据0和数据1的表达方式

RS232

逻辑1:-3~-15v 逻辑0:+3~+15v

  • 全双工通信
  • 使用于大型机械
  • 抗静电干扰强

RS422

输出信号电平:差动模式,低电平(负电压)-2V至-6V,高电平(正电压)+2V至+6V 输入信号电平:差动模式,低电平(负电压)-7V至0V,高电平(正电压)0V至+7V

  • DB9、DB25才叫接口标准,现在RS232用的多的都是DB9。
  • 全双工通信
  • 一主多从,支持一对多双向通信,从设备间不能通信

RS485

逻辑1:两线压差+2~+6v 逻辑0:两线压差-2~-6v

  • 差分信号
  • 通信距离远
  • 半双工通信

TTL

逻辑1:3.3V/5V(>2.0) 逻辑0:0V(<0.8)