嵌入式常见通信协议学习——UART

UART(通用异步收发器)

UART((Universal Asynchronous Receiver Transmitter)是一种通用的串行、异步 通信总线,它有两条数据线(TX、RX),可以实现全双工的发送和接收。

复习下常见概念:

  1. 串行通信 :只用 1 根数据线,数据按依次排队,逐位顺序发送、逐位接收。

  2. 并行通信 :多根数据线并行,多位 数据(如 8 位、16 位)同一时刻同时传输。

  3. 异步通信无公共时钟线,收发双方使用各自独立时钟,依靠协议约定(起始位、停止位、校验位)实现数据对齐。

  4. 同步通信 :通信双方共用同一根时钟线(CLK) ,所有数据收发严格跟随统一时钟节拍。

  5. 单工通信单向永久固定通信,一端只能发送,一端只能接收,无法反向。

  6. 半双工通信 :支持双向传输 ,但同一时刻只能单独发或单独收,收发不能同时进行,需要切换方向。

  7. 全双工通信收发通道完全独立,发送和接收可以同时进行 ,互不占用、互不阻塞。

  8. 波特率:每秒传输码元(通信线路上一次信号变化的波形/电平组合,是信号的最小单位。)的数量。

  9. 比特率 :每秒传输二进制比特 (0/1) 的数量,代表真实数据速度。

    N:一个码原能够表示的状态数,例如:对于UART、RS232串口,1个码原只能表示高低电平两种状态,则N=2,比特率=波特率。

UART帧格式

  1. 串口可以发送5-8位,可以是5、6、7、8位(最多8位),先发低位再发高位
  2. 校验位:分为奇校验、偶校验和无校验三种模式。数数据位中有多少个1,如果是偶校验,数据位中有偶数个1,则校验位为0,反之为1;如果是奇校验,数据位中有奇数个1,则校验位为0,反之为1。简单来讲,偶校验凑偶数个 1,奇校验凑奇数个 1。

举个例子来理解一下UART的数据发送,从设备A端发送0x55(01010101)到设备B端,校验位选择偶校验,则波形如下:

有没有想过为什么UART串口一次最多只能发送8位数据?

首先,前面我们说到,UART串口是异步通信的,异步通信没有统一时钟,收发双方的时钟频率存在微小偏差。每传输一位,误差就会累积一点。如果帧太长(比如超过 8 位),到帧末尾时,接收端的采样点可能已经偏移到下一个比特的电平区间,导致采样错误、数据乱码。其次,计算机最小能寻址单位是1字节(8位),发送8位数据方便CPU处理,不需要额外的拆分或拼接。此外,8 位数据位能覆盖 ASCII 字符集(0~127),满足绝大多数文本通信需求,同时也能传输二进制数据。

那为什么UART串口一次最少要发送5位数据?

早期电传打字机使用 5 位编码(Baudot 码)来表示字母、数字和控制字符,刚好能覆盖当时的通信需求。UART 协议为了兼容这些老式设备,保留了5 位数据位的最小配置。此外,如果数据位少于 5 位,加上起始位、停止位后,整帧长度过短,接收端很难可靠地识别起始位和停止位,容易被噪声干扰误判为有效帧,导致通信不稳定。

UART硬件连接

注意TXD与RXD连接,否则无法进行通信。

数据转换

如何将二进制转换成可读的文本信息呢?

将二进制数据还原成字节流(1字节=8位二进制),按照约定的字符编码规则把字节映射成字符。常见编码表有:

以ASSCII编码规则为例:如果发送端依次发送了0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64,将这几个字节转换成十进制:72,101,108,108,111,32,87,114,108,100,这些十进制在ASCII码表中对应的是:72(H),101(e),108(l),108(l),111(o),32(空格),87(W),111(o),114®,108(l),100(d),即:Hello World。

相关推荐
oshan20127 小时前
零基础STM32入门教程--10-PWM 呼吸灯
stm32·单片机·嵌入式硬件
Messy create13 小时前
【BMS-AFE-温度检测】
stm32·单片机·能源
桃蹊、14 小时前
串口/网络透传实战:FreeRTOS 多任务架构与连接池设计
stm32·物联网·wifi·freertos
新晨单片机设计15 小时前
S001A-基于STM32单片机超声波视力保护仪【Proteus仿真+Keil程序+原理图】
stm32·单片机·proteus
星河单片机15 小时前
STM32驱动Y01-3IN1空气质量模块+OLED显示完整教程
stm32·单片机·嵌入式硬件·空气质量·甲醛检测·二氧化碳检测·tvoc检测
玩转单片机与嵌入式16 小时前
深入浅出TinyML 21:INT8量化改变了模型中的哪些数据?
stm32·深度学习·tinyml
别催小唐敲代码16 小时前
stm32_mpu6050_滤波教程
stm32·单片机·嵌入式硬件
一条破秋裤17 小时前
STM32 学习笔记:GPIO 输出实验——LED 闪烁、流水灯与蜂鸣器
笔记·stm32·学习
一条破秋裤18 小时前
STM32 学习笔记:GPIO 输出原理与硬件设计
笔记·stm32·学习
单片机仿真设计19 小时前
【proteus仿真设计】基于 STM32 单片机火灾监测报警系统设计(仿真图+程序)
stm32·单片机·嵌入式硬件·proteus·毕设