欢迎光临
我们一直在努力

UART通信TX和RX编码规则与波形

目录

概述

1 基本编码规则

1.1 帧结构

1.2 关键参数

1.3 串口通信要点

2 典型波形示例

3 时序特性

3.1 位时间计算

3.2  完整帧时间

4 使用IO模拟UART

5 实际波形案例分析

6 UART通信参数配置

6.1 关键参数详解

6.2 常用波特率表

7 UART编程模型

7.1 轮询方式

7.2 中断方式

7.3 DMA方式

8 UART变种与相关协议


概述

UART通信是一种异步串行通信协议,其中TX(发送线)和RX(接收线)分别用于发送和接收数据。本文主要介绍编码规则和波形。

1 基本编码规则

1.1 帧结构

USART
字符帧(
8
数据位和
1
停止位)

  • 空闲状态:线路保持高电平(逻辑1)

  • 起始位:1位低电平(逻辑0),标志数据帧开始

  • 数据位:5-9位,通常为8位,LSB(最低位)先发送

  • 校验位:奇校验、偶校验或无校验

  • 停止位:1、1.5或2位高电平(逻辑1)

1.2 关键参数

  • 波特率:常见的有9600、115200等

  • 数据位:5、6、7、8、9位(常用8位)

  • 停止位:1、1.5、2位

  • 校验位:无、奇、偶校验

1.3 串口通信要点

  • 异步通信:无时钟线,依靠双方约定的波特率

  • 起始位同步:每个数据帧重新同步

  • LSB优先:数据位从最低位开始传输

  • 空闲高电平:线路空闲时保持逻辑1

  • 帧间隔:停止位后可立即发送下一帧或保持空闲

  • 2 典型波形示例

    示例1:发送字符'A' (0x41 = 0100 0001b)

    • 配置:8位数据,无校验,1停止位,波特率9600

    • 发送顺序(LSB先发):1 0 0 0 0 0 1 0

    示例2:带奇校验的波形

    发送字符'B' (0x42 = 0100 0010b),1的个数为2(偶数)

    • 奇校验:校验位应为1(使总1的个数为奇数)

    • 发送顺序:0 1 0 0 0 0 1 0 1

    3 时序特性

    3.1 位时间计算

    3.2  完整帧时间

    4 使用IO模拟UART

    代码示例如下:

    // 简化版UART发送模拟
    void uart_send_byte(uint8_t data) {
    // 发送起始位(低电平)
    TX_PIN = 0;
    delay_bit_time();

    // 发送8个数据位(LSB先发)
    for(int i = 0; i < 8; i++) {
    TX_PIN = (data >> i) & 0x01;
    delay_bit_time();
    }

    // 发送停止位(高电平)
    TX_PIN = 1;
    delay_bit_time();
    }

    5 实际波形案例分析

    1) 9600波特率传输"Hello"

    2) 115200波特率带奇校验

    6 UART通信参数配置

    6.1 关键参数详解

    // 典型UART配置结构
    typedef struct {
    uint32_t baud_rate; // 波特率:9600, 19200, 38400, 57600, 115200等
    uint8_t data_bits; // 数据位:5, 6, 7, 8, 9
    uint8_t stop_bits; // 停止位:1, 1.5, 2
    char parity; // 校验:N(无), O(奇), E(偶)
    bool flow_control; // 流控:RTS/CTS
    } uart_config_t;

    6.2 常用波特率表

    波特率          

    位时间  

    字符/秒(8N1)

     应用场景    

    300

    3.33ms  

    30

    老式调制解调器

    1200

    833μs

     120  

    早期终端  

    2400

    417μs

    240  

    简单传感器    

    9600

    104μs

    960    

    最常用,稳定可靠

    19200

    52μs  

    1920      

    中速通信    

    38400

    26μs  

    3840

    蓝牙SPP    

    57600

    17.4μs  

    5760

    GPS模块      

    115200

    8.68μs

    11520    

     高速调试端口

    230400

    4.34μs

    23040  

    高速数据采集  

    460800

    2.17μs

    46080

    视频传输

    921600

    1.09μs

    92160

    极限速率

    7 UART编程模型

    7.1 轮询方式

    // 简单但效率低,适用于低速通信
    void uart_send_polling(uint8_t data) {
    while(!(UART->SR & UART_SR_TXE)); // 等待发送缓冲区空
    UART->DR = data;
    }

    uint8_t uart_receive_polling(void) {
    while(!(UART->SR & UART_SR_RXNE)); // 等待接收数据
    return UART->DR;
    }

    7.2 中断方式

    // 提高效率,避免CPU空等
    volatile uint8_t rx_buffer[256];
    volatile uint8_t rx_index = 0;

    void USART1_IRQHandler(void) {
    if(USART1->SR & USART_SR_RXNE) {
    // 接收数据
    uint8_t data = USART1->DR;
    rx_buffer[rx_index++] = data;

    // 处理数据(如放入环形缓冲区)
    }

    if(USART1->SR & USART_SR_TXE) {
    // 发送缓冲区空,可发送下一字节
    if(tx_buffer_not_empty()) {
    USART1->DR = get_next_tx_byte();
    } else {
    USART1->CR1 &= ~USART_CR1_TXEIE; // 禁用发送中断
    }
    }
    }

    7.3 DMA方式

    // 最高效率,适合大数据量传输
    void uart_dma_send(uint8_t *data, uint32_t len)
    {
    // 配置DMA源地址(内存)
    DMA1_Channel4->CMAR = (uint32_t)data;
    // 配置DMA目标地址(UART数据寄存器)
    DMA1_Channel4->CPAR = (uint32_t)&USART1->DR;
    // 设置传输长度
    DMA1_Channel4->CNDTR = len;
    // 启动DMA传输
    DMA1_Channel4->CCR |= DMA_CCR_EN;
    // 使能UART的DMA发送
    USART1->CR3 |= USART_CR3_DMAT;
    }

    8 UART变种与相关协议

    1) USART(Universal Synchronous/Asynchronous Receiver/Transmitter)

    • 支持同步和异步模式

    • 同步模式下有时钟线(如SPI)

    • 常见于STM32等高级MCU

    2)  LIN(Local Interconnect Network)

    • 基于UART的汽车网络协议

    • 单线通信,成本低

    • 主从结构,用于车身控制

    3)  IrDA(红外数据通信)

    • 使用UART协议,红外介质

    • 需要编解码芯片

    • 短距离无线通信

    4) Modbus RTU

    • 基于串口的工业协议

    • 使用UART作为物理层

    • 主从问答式通信

    赞(0)
    未经允许不得转载:171主机测评 » UART通信TX和RX编码规则与波形
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址