引言

操作系统本身作为一个运行在保护内存空间的软件,并不直接感知物理电信号。因此,它必须借助总线、接口与协议这三者来共同构建一个稳定、统一的硬件抽象层。

  • 通信接口(硬件,物理)
  1. 物理特性:连接器的形状、尺寸、引脚数量、引脚排列。

  2. 电气特性:代表数字0和1的电压水平是多少、信号的传输速率(波特率)、阻抗匹配等。

  3. 功能特性:引脚作用(数据线,时钟线,电源线,地线)。

  • 通信协议(逻辑,软件)
  1. 数据帧格式:通常包括起始位、地址域、控制域、数据域、校验位(CRC)、停止位。

  2. 通信时序:什么时候可以开始发送数据?发送方和接收方如何同步?是否需要时钟信号?(同步 vs 异步)

  3. 握手与应答:双方确认数据已成功接收;

  4. 寻址机制:多个设备通信时找到目标设备;

  5. 错误检测与纠正:发现传输过程中的错误(如奇偶校验、CRC校验)。

  • 总线(共享的通信路径)
  1. 共享性:多个设备挂接在同一组信号线上,通过仲裁来分时使用这条通道。

  2. 拓扑结构:通常是多对多的结构(如一条总线连接一个主设备和多个从设备)。

  3. 标准化:涵盖了机械接口、电气特性、信号时序、通信协议等所有方面。

1. USART(通用同步/异步收发器)

串行通信为通用同步/异步收发器接口(Universal Synchronous/Asynchronous Receiver/Transmitter,USART),同时支持同步单向数据通信和半双工单线通信(单线模式)。如下图则是PC与微处理器之间通过USART进行数据交换和通信。

串行通信过程

简单来说,USART的物理层就是两个通信线(接收和发送)双方约定好通信的速度,也就是波特率 Baud Rate,单位为bps(bit per second,bps)。

USART 的通信协议

USART发送和接收数据的流程图
  • 关键时序特征
  1. 波特率:串口通信的速率,异步通讯中由于没有时钟信号,所以两个通讯设备之间应该约定好波特率。
  2. 起始位:标志一个内容帧的开始,固定为低电平,串口的空闲状态位高电平。
  3. 数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行。
  4. 校验位:用于数据验证,根据数据位计算得来。
  5. 停止位:用于数据帧间隔,固定为高电平,为下一个起始位做准备。
信号时序图

USART 缺点

  • 不能远距离传输信号(发展出 RS232,RS485)

[!NOte]

UART本身定义的是“逻辑电平”,而不是“物理电平”。

  1. 电压衰减:TTL电平的电压较低(5V),在长距离传输时,导线电阻和干扰会导致信号电压衰减,接收端可能无法正确识别0和1。
  2. 抗干扰能力差:TTL是单端信号(一根信号线,以地线为参考)。长距离布线就像一根天线,会引入大量的外部电磁干扰。这些干扰会叠加在信号上,严重扭曲波形。
  3. 地电位差:在长距离通信中,发送端和接收端的“地”可能不在同一个电位上(存在地电位差)。这个电压差会直接导致信号判决错误。
  • 较慢的通信速度(发展出SPI)

[!NOte]

UART是异步通信,且依赖于精确的预定义波特率。

  1. 时钟累积误差:发送器和接收器使用各自独立的内部时钟。即使初始波特率设置相同,晶体振荡器的微小误差也会随着时间(随着每个比特的传输)而累积。这限制了单个数据帧不能太长(通常是8-10位),否则会因为时钟不同步而采样到错误的比特。
  2. 起始位同步的精度:接收端仅在每个字节的起始位边沿进行一次同步,之后的所有比特都基于这个初始同步和预定的波特率进行采样。如果波特率有偏差,在帧的末尾采样点就可能偏离比特中心,导致误码。这从根本上限制了其最高速率。
  3. 开销:每个字节都需要额外的起始位和停止位(至少2位开销),有效数据吞吐量降低。
  • 不能一对多通信(发展出I2C)

[!NOte]

UART的通信模型是点对点的,没有寻址机制。

  • 点对点模型:一个UART端口通常只能直接连接另一个UART端口。TX对RX,RX对TX。如果要将一个主设备连接到多个从设备,你需要为每个从设备配备一个独立的UART端口,这非常浪费硬件资源。
  • 没有地址概念:UART发送的数据就是纯数据流,数据帧里不包含任何地址信息。接收端无法判断这个数据是不是发给自己的。

2. RS232 和 RS485

这些协议在UART的上层,定义了更强大、更适合远距离的物理层标准。UART负责组帧(起始位、数据位、停止位),RS232/RS485负责将TTL电平转换成更适合传输的电平。