U(S)ART 串口理论

  • Universal synchronous / asynchronous receiver transmitter
  • 通用同步 / 异步 接收发送器,俗称"串口"

通信相关概念

单工/双工/全双工/半双工

  • 对通信方向的描述
  • 单工,指通信方向只能是从A到B
  • 双工,指通信方向可以从A到B,也可以B到A
  • 全双工和半双工的区别在于,在同一个时刻,是否A和B能同时向对方发送数据

异步/同步

  • 区别在于通信双方是否有同步信号CLK,异步:没有,同步:有
    • 同步通信
复制代码
- 异步通信
  • 常见的异步通信方式有:串口(UART),USB,CAN
  • 常见的同步通信方式有:SPI,I2C等

串行/并行

  • 串行通信,指数据在数据线上,一位一位的顺序传送
  • 并行通信,指同时有多位数据在多条数据线上一起传送
  • 并行通信效率高,但占用的数据通信线多,一般用于MCU与存储器、高分辨率的显示屏的通信
  • 串行通信效率低,但占用的数据通信线少,线路简单

UART 通信

  • UART理论上是全双工异步串行通信
  • 波特率:每秒传输二进制数的位数,单位是位/秒,缩写成bps,例如115200bps,表示每秒传输115200个二进制位,波特率通常是约定的值,不任意取值,常见的有4800,9600,19200,38400,57600,115200,还可以更高
  • 起始位 Start Bit:没有数据传输的时候,数据发送脚必须是逻辑1,开始传输数据,则每个字节需要有1位时间的逻辑0,通知接收方
  • 有效数据:跟在起始位后面的正式数据,通常为8位,注意,传输过程是低位在先(LSB)
  • 数据校验:在有效数据之后,有一个可选的数据校验位。用于检查传输过程中是否由于干扰造成数据错误。校验方法有奇校验(odd)、偶校验(even)、0校验(space)、1校验(mark)以及无校验(noparity)
    • 奇校验:要求有效数据和校验位中"1"的个数为奇数,比如有效位数据为"01000010",其中有2个"1",则校验位需要为"1",让"1"的个数为奇数
    • 偶校验:和奇校验相反,要求有效数据和校验位中"1"的个数位偶数
  • 停止位 Stop Bit:有效数据传输完成后,标志传输停止的数据位,必须是逻辑1,持续位宽可以是1或2位时间

数据通信格式

  • 示例
  • UART 通信的基本单位是一帧数据:
latex 复制代码
┌─────────┬──────────────┬─────────────┬─────────────┐
│ 起始位  │   数据位      │   校验位    │   停止位    │
│ (Start) │ (Data bits)  │ (Parity)    │ (Stop)      │
├─────────┼──────────────┼─────────────┼─────────────┤
│ 1 bit   │ 5~8 bits     │ 0 or 1 bit  │ 1~2 bits    │
│ 逻辑0   │ LSB 先传     │ 可选        │ 逻辑1        │
└─────────┴──────────────┴─────────────┴─────────────┘
字段 电平 作用
起始位 逻辑 0 通知接收方"数据要来了",用于同步
数据位 0/1 实际传输的数据,低位先传(LSB First)
校验位 0/1 可选,用于检错(奇校验或偶校验)
停止位 逻辑 1 标志一帧结束,给接收方准备下一帧的时间

通信流程

latex 复制代码
发送端 TX:  空闲(高)  [起始位0] [数据位 LSB→MSB] [校验位] [停止位1]   空闲(高)
               ↓         ↓         ↓         			 ↓        ↓
接收端 RX:  空闲(高)   检测下降沿  中间点采样  		检错    检测停止位  存入缓冲区

参数约定

参数 说明 常见值
波特率 每秒传输的位数 9600, 115200, 460800 等
数据位 每帧数据的有效位数 5, 6, 7, 8 位(常用 8 位)
停止位 每帧结束的标志位数 1, 1.5, 2 位(常用 1 位)
校验位 可选,用于简单检错 无校验、奇校验、偶校验

这些参数必须收发双方完全一致,否则通信会乱码

发送流程

  • 以发送一个字节 0x53 为例,假设配置:9600 波特率,8 数据位,1 停止位,无校验
步骤 1:空闲状态
  • TX 线保持高电平(逻辑 1),表示线路空闲
步骤 2:发送起始位
  • TX 线拉低(逻辑 0),持续 1 个位时间(1/9600 ≈ 104μs)
  • 接收方检测到这个下降沿,开始同步
步骤 3:发送数据位
  • 从 LSB(最低位) 开始,逐位发送数据
  • 0x53 = 0101 0011(二进制)
  • 发送顺序:1 → 1 → 0 → 0 → 1 → 0 → 1 → 0(从低位到高位)
  • 每个位持续 1 个位时间
步骤 4:发送校验位
  • 如果有校验位,在此发送
步骤 5:发送停止位
  • TX 线拉高(逻辑 1),持续 1 个位时间(或 1.5/2 个)
  • 接收方检测到停止位,知道一帧结束
步骤 6:可选的空闲或下一帧
  • 如果没有下一帧数据,TX 保持高电平空闲
  • 如果有下一帧数据,重复步骤 2~5

接收流程

  • 接收方的采样时机是关键:
  • 采样策略(以过采样为例)
    • UART 控制器通常使用 16 倍波特率时钟进行过采样
    • 在检测到起始位(下降沿)后,在每个位的中间点进行采样,避免边沿抖动
  • 接收步骤
    • 检测起始位:检测到 TX 线从高→低跳变,开始同步
    • 采样数据位:在每个数据位的中间点采样,得到 8 位数据(LSB 先到)
    • 校验(可选):计算校验位,与接收到的校验位对比,不一致则标记错误
    • 检测停止位:确认停止位为高电平,否则标记帧错误
    • 存入缓冲区:将接收到的字节存入 RX 缓冲区,供 CPU 读取

UART通信的与TTL\232\485关系

TTL电平串行通信

  • 简单的说,MCU的UART引脚发出的电平就是TTL电平
  • 用低电平(0V)表示逻辑0(也称之为 space ,空号),用高电平(3.3V或5V)表示逻辑1(也称之为 mark , 传号),这种编码模式称之为 NRZ码------不归零编码
  • 收发双方的发送和接收需要交叉连接。一般通信距离小于1m

RS232串行通信

  • 用-3V~-15V表示逻辑1,+3~+15V表示逻辑0
  • 可以增加传输距离,最大15米
  • 有RTS、CTS、DSR、DTR和DCD等控制线
  • 一般使用DB9接口

硬件流控

在通信双方处理数据的速度不匹配时使用

RTS (Require ToSend,发送请求)为输出信号,用于指示本设备准备好可接收数据,低电平

有效,低电平说明本设备可以接收数据

CTS (Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有

效,低电平说明本设备可以向对方发送数据

RS485串行通信

  • 用一对双绞线传输数据,用线A和线B的相对电压表示逻辑电平,称之为差分电平
  • 发送端:逻辑"1"以两线间的电压差 +2V ~ +6V 表示;逻辑"0"以两线间的电压差 -2V ~ -6V表示
  • 接收端:A 比B 高200mV 以上即认为是逻辑"0",A 比B 低200mV 以上即认为是逻辑"1"
  • 适合远距离传输,波特率位9600bps时,可达1200米
  • 只能半双工传输,通常是一主多从结构,最多128个从机

注意

  • 不同的电平之间转换------TTL电平的串口绝不能和RS232电平的串口直接连接通信,会损坏接口
  • 接口一般不能热插拔------热插拔容易产生浪涌,导致接口芯片损坏。
  • TTL和RS232需要共地------共模信号需要有共同的参考地电平才能判断出高低电平。
  • 可以一发多收,但不能多发一收------驱动能力够的前提下,串口允许一发多收,类似于广播,但不能多发一收,电平会混乱甚至烧毁硬件电路。
  • 注意MCU时钟频率误差对通信的影响------波特率越高,时钟误差的影响越大
相关推荐
嵌入小生0072 天前
硬件 --- 通信 --- uart/通信方式/电平标准/通信方向
uart·通信·串行通信·并行通信·电平标准·通信方向
謓泽2 天前
【MODBUS】串口 RTU / Modbus TCP / 透明就绪
网络·串口·modbus
’长谷深风‘2 天前
51单片机入门(3:串口通信)
单片机·嵌入式硬件·51单片机·串口·串口通信
暮雪倾风8 天前
【软件安装】VSPD(Virtual Serial Port Driver)虚拟串口软件安装及使用
单片机·串口
FPGA_小田老师12 天前
Xilinx AXI UART Lite IP核:IP核深度解析
fpga开发·uart·串口通讯·axi转uart
蓝天居士1 个月前
RS485在Linux内核(驱动)及全志T113平台上的实现(7)
串口·rs485·设备驱动
蓝天居士1 个月前
RS485在Linux内核(驱动)及全志T113平台上的实现(4)
串口·rs485·设备驱动
蓝天居士1 个月前
RS485在Linux内核(驱动)及全志T113平台上的实现(5)
串口·rs485·设备驱动
非鱼䲆鱻䲜1 个月前
esp32基于中断+FIFO+事件队列的uart
单片机·嵌入式硬件·esp32·uart