UART通信全解析:从原理到实战

UART概念

UART(Universal Asynchronous Receiver/Transmitter)是一种通用异步收发器,用于设备间的异步通信。其核心特点包括:

  • 异步通信:无需共享时钟信号,通过预定义的波特率同步数据传输。
  • 全双工:支持同时收发数据,通过独立的数据线(TXD和RXD)实现。
  • 串行协议:数据按位顺序传输,遵循LSB(低位优先)原则。

UART接线方式

典型接线包括四根线:

  • VCC:连接电源正极,为设备供电。
  • GND:接地,确保共地参考。
  • RXD(接收线):接收来自对方设备的数据。
  • TXD (发送线):向对方设备发送数据。
    注意:设备间通信时需交叉连接(TXD→RXD,RXD→TXD)。

通信模式

  1. 单工

    • 固定方向的单向通信(如传感器→控制器)。
    • 仅需一根数据线,传输方向不可逆。
  2. 半双工

    • 双向通信但分时复用(如对讲机)。
    • 单根数据线,同一时间仅允许一端发送。
  3. 全双工

    • 双向同时通信(如电话)。
    • 双数据线(TXD/RXD),收发独立进行。

数据传输形式

  • 串行传输
    • 逐位传输,速率较低,但成本低、抗干扰强,适合远距离通信。
  • 并行传输
    • 多比特同时传输,速率高,但成本高且易受信号偏移干扰,适合短距离。

奇偶校验

  • 奇校验:数据位加校验位后"1"的总数为奇数。
  • 偶校验:数据位加校验位后"1"的总数为偶数。
  • 无校验 :不进行校验,适用于低误码率环境。
    局限性:无法检测偶数个比特的错误。

串口通信参数

常用格式为波特率 数据位 校验位 停止位,例如:

  • 9600 8 N 1:波特率9600bps,8位数据,无校验,1位停止位。
  • 115200 8 O 1:波特率115200bps,8位数据,奇校验,1位停止位。
    波特率:每秒传输的比特数(如2400、9600、115200等)。

同步与异步

  • 同步:通过时钟线同步通信频率(如SPI)。
  • 异步:无时钟线,依赖预定义波特率(如UART)。

寄存器配置(以8051为例)

  1. SCON寄存器

    • 设置SM0=0SM1=1,选择8位UART可变波特率模式。
    • REN=1允许接收数据。
    • RI标志位需软件清零,表示数据接收完成。
  2. PCON寄存器

    • SMOD=1使波特率翻倍。
    • SMOD0=0,由SCON的SM0/SM1决定工作模式。

波特率计算 (定时器1 8位自动重装模式):

公式为:

\\text{波特率} = \\frac{2\^{\\text{SMOD}} \\times \\text{定时器溢出率}}{32} \] 其中定时器溢出率由初值决定。 #### 主机与从机 * **主机**:发起通信并控制流程(如发送指令)。 * **从机**:响应主机指令,被动执行操作并回复应答。 #### 时序图与数据帧 UART数据帧包含: 1. 起始位(低电平)。 2. 数据位(5-8位,LSB优先)。 3. 可选的校验位。 4. 停止位(高电平,1-2位)。 **示例代码(8051初始化UART)**: ```c void UART_Init() { SCON = 0x50; // 8位UART,允许接收 PCON |= 0x80; // SMOD=1,波特率加倍 TMOD = 0x20; // 定时器1模式2(8位自动重装) TH1 = 0xFD; // 波特率9600(假设晶振11.0592MHz) TR1 = 1; // 启动定时器1 } ```

相关推荐
hweiyu0019 小时前
Linux 命令:diff3
linux
羽获飞20 小时前
从零开始学嵌入式之STM32——7.STM32的系统架构
stm32·单片机·嵌入式硬件
代码AI弗森20 小时前
WSL2:在 Windows 上获得一整套可托付的 Linux 工程环境
linux·运维·服务器
不会代码的小猴20 小时前
Linux环境编程第五天笔记
linux·笔记
来自晴朗的明天20 小时前
6、AD7683 单通道 AD 采样电路
单片机·嵌入式硬件·硬件工程
TEL1369976275020 小时前
方寸微PT153s千兆网口方案 替代RTL8153b方案
单片机·嵌入式硬件
firstacui20 小时前
搭建harbor仓库
linux·docker
niceffking20 小时前
Linux信号相关函数
linux·运维·服务器·linux信号
蚰蜒螟20 小时前
Linux 7 中的系统调用原理
linux·运维·服务器
Reuuse20 小时前
【linux】进程间通信
linux·运维·服务器