首页 > 其他分享 >UART基础知识

UART基础知识

时间:2024-12-31 16:25:36浏览次数:3  
标签:校验位 UART 基础知识 发送 寄存器 波特率 数据

UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种广泛应用于嵌入式系统中的串行通信协议,用于设备间的数据传输。

1. UART的基本原理
  • UART是一种异步通信协议,无需额外的时钟信号,通过约定的波特率实现通信。

  • 数据通过串行方式逐位传输,起始位和停止位用于标志数据的开始和结束。

  • 常见的帧格式包括:起始位(1位) + 数据位(5-8位) + 可选校验位 + 停止位(1或2位)。

  • 发送数据时,先发送低位再发送高位,例如发送0x55(01010101)时,数据格式为:空闲位 + 起始位 + 1 0 1 0 1 0 1 0(数据位) + 校验位 + 停止位 + 空闲位。

2. UART通信的关键参数
  1. 波特率(Baud Rate):表示每秒传输的位数(bps),常见波特率有9600、115200等,通信双方需要设置相同的波特率。

  2. 数据位(Data Bits):一帧数据中有效数据的长度,通常是8位。

  3. 校验位(Parity Bit):用于检测传输过程中是否有错误,可选奇校验、偶校验或无校验。例如:

    • 奇校验:发送数据中奇数个1时,校验位为0;偶数个1时,校验位为1。

    • 偶校验:发送数据中偶数个1时,校验位为0;奇数个1时,校验位为1。

  4. 停止位(Stop Bit):标志数据帧的结束,可以是1位或2位。

3. UART的工作流程
  1. 发送端将数据写入发送寄存器(TX Buffer)。

  2. 数据经过串行化后通过TX引脚输出。

  3. 接收端通过RX引脚接收数据并存入接收寄存器(RX Buffer)。

  4. 接收端将数据重新组帧并交给上层处理。

  5. 接收方通过波特率及时间判定传输的数据内容和时序。

4. UART的硬件组成
  • 发送模块:负责数据的串行化,添加起始位和停止位。

  • 接收模块:负责接收串行数据,校验并重新组帧。

  • 波特率发生器:生成与设定波特率相符的时钟信号。

  • FIFO寄存器:缓冲多字节数据,避免数据丢失。

5. UART的连接方式
  • UART通信使用两条数据线实现全双工通信(TX和RX),总线需交叉接线,即发送端的TX连接到接收端的RX。

  • 半双工通信只需一条数据线,但无法同时进行发送和接收。

  • 设置引脚功能的本质是将引脚在芯片内部连接到相应的UART控制器。

6. UART的优缺点

优点:

  • 硬件简单,成本低。

  • 通信距离较长,可达几十米。

  • 使用方便,无需时钟同步。

缺点:

  • 通信速率有限,通常不超过1Mbps。

  • 不支持多设备总线通信。

  • 容易受噪声干扰,需要良好的信号调节。

7. UART寄存器与配置

UART控制器通过一系列寄存器实现数据传输、配置和状态管理。常见寄存器包括:

  1. 数据寄存器(DR/THR/RHR)

    • 用于存储要发送或接收的数据。

    • 写入数据寄存器表示发送,读取数据寄存器表示接收。

  2. 波特率寄存器(Baud Rate Register)

    • 用于设置通信波特率。

    • 通常需要分频器和系统时钟的配合来实现精确的波特率。

  3. 控制寄存器(Control Register)

    • 包含启用UART模块、设置数据位长度、校验位、停止位等配置项。

  4. 状态寄存器(Status Register)

    • 用于指示UART当前状态,例如发送缓冲区是否满、接收缓冲区是否有数据等。

  5. 中断寄存器(Interrupt Register)

    • 配置和管理UART的中断功能,例如接收数据完成中断、发送完成中断等。

8. UART编程实现

以下是一个简单的UART初始化和数据收发流程示例(以STM32为例):

#include "stm32f4xx.h"

void UART_Init(void) {
    // 1. 配置波特率
     USART1->BRR = 0x683; // 假设波特率为9600,时钟频率为16MHz
    // 2. 启用发送和接收功能
    USART1->CR1 |= USART_CR1_TE | USART_CR1_RE;

    // 3. 启用UART外设
    USART1->CR1 |= USART_CR1_UE;
}

void UART_SendChar(char c) {
    while (!(USART1->SR & USART_SR_TXE)); // 等待发送缓冲区为空
    USART1->DR = c;
}

char UART_ReceiveChar(void) {
    while (!(USART1->SR & USART_SR_RXNE)); // 等待接收缓冲区有数据
    return USART1->DR;
}

int main(void) {
    UART_Init();

    // 发送数据
    UART_SendChar('H');
    UART_SendChar('i');

    // 接收数据并回显
    char received = UART_ReceiveChar();
    UART_SendChar(received);

    while (1);
}
9. UART与其他通信协议的比较
协议类型传输速度是否同步支持设备数量
UART串行异步较低(1Mbps以内)1对1
SPI串行同步较高(几十Mbps)1对多
I2C串行同步中等(几Mbps)多主多从
10. UART调试中的常见问题及解决方法
  1. 波特率不匹配:确认发送端和接收端波特率一致。

  2. 数据丢失:检查FIFO寄存器的溢出标志,确保软件及时读取数据。

  3. 噪声干扰:缩短连线长度,增加屏蔽层,或降低波特率。

  4. 校验失败:确认校验方式一致。

11. UART在实际项目中的应用

UART常用于以下场景:

  • 微控制器与传感器之间的数据通信。

  • 调试接口(如串口调试工具)。

  • GPS模块、蓝牙模块、Wi-Fi模块的通信。

  • 工业设备的控制和监控。

标签:校验位,UART,基础知识,发送,寄存器,波特率,数据
From: https://blog.csdn.net/q54724/article/details/144772673

相关文章

  • 解决Spring boot集成quartz时service注入失败为null的问题
    解决Springboot集成quartz时service注入失败为null的问题一、报错信息二、代码任务类源代码配置类原代码三、注入失败原因四、解决的思路11、任务类修改2、配置类修改五、解决的思路2一、报错信息java.lang.NullPointerException:nullatfarbun.server.schedul......
  • Linux Shell 脚本编程基础知识篇—awk编程语言(1)
    ℹ️大家好,我是练小杰,今天是2024年最后一天,明天再见就是2025了......
  • 一名程序员决定学点会计基础知识
    1.概述企业是一种以营利(即获取经济利润)为目的的经济组织。在会计看来,企业一辈子其实只做了三件事:经营、投资和筹资。在正常情况下,企业的经济活动是一个川流不息的过程。这一过程也是运用、分配及耗用企业经济资源的过程。由于资金是企业经济资源的货币表现形式或价值表现形式,......
  • 【网络基础知识】两台电脑不在一个城市,如何使这两台电脑构成一个局域网?
    两台电脑即使不在一个城市,通过一些非常规的技术方法,依然可以实现这两台电脑间的局域网构建。具体构建方法大致有以下几种,下面我们具体来了解一下。首先我们应对局域网有一个清晰认识,局域网简称LAN,是在一个具体区域内实现多台计算机设备的互联互通,在局域网内实现文件管理,数据共享......
  • 保险丝的基础知识
    保险丝是一种保护电器的电子元件。它通常在电路中串联。当故障电流增大到一定值时,它会自行熔断并切断电路,从而保护电路中的其他器件。保险丝是最常用的电路过电流保护模块。传统的熔断器主要由两端带金属连接端子的管体和管内金属熔体两部分组成。大多数保险丝是圆柱形的,即管状......
  • UART信号测试:确保通信质量
    在现代电子系统中,串行通信是实现数据交换的核心手段之一。UART(通用异步收发传输器)作为一种常见的串行通信协议,被广泛应用于嵌入式设备、微控制器及其他低速通信系统中。UART信号的可靠性直接影响着通信系统的稳定性和数据传输的准确性。因此,进行UART信号测试是确保设备正常工作......
  • Flutter 基础知识总结
    1、Flutter介绍与环境安装为什么选择Dart:基于JIT快速开发周期:Flutter在开发阶段采用JIT模式,避免每次改动都进行编译,极大的节省了开发时间基于AOT发布包:Flutter在发布时可以通过AOT生成高效的ARM代码以保证应用性能UI帧率可达120FPS:为了快速流畅的用户体......
  • (十).NET6.0 搭建基于Quartz组件的定时调度任务
    1.添加Quartz定时器组件2.新建类库项目Wsk.Core.QuartzNet,并且引用包类库项目。然后新建一个中间调度类,叫QuartzMiddleJob3.新建一个Job工厂类,叫YsqJobFactory,用来获取刚刚创建的中间调度类的服务4.新建一个通用执行计划类,叫YsqJobSchedule,用于每次任务都通过该计划进行......
  • python基础知识(七)
    文章目录python网络编程socket对象方法示例pythonSMTP发送邮件python多线程_thread创建线程threading模块创建线程threading常用方法继承threading创建线程线程同步线程优先级队列(Queue)python网络编程Python中,我们用socket()函数来创建套接字,语法格式如下:so......
  • 信息安全入门(非常详细),零基础入门到精通,看这一篇就够了_边做边学信息安全基础知识、基
    前言俗话说:未知攻焉知防,如果你对潜在的攻击或威胁并不了解,那么你就无法有效地制定防御措施。这是信息安全领域中的一个重要理念,强调在面对未知的网络攻击时,防御系统无法做到完全的预防和防护,必须具备应对未知威胁的能力和策略。学习信安首先要有足够的耐心,戒骄戒躁,不要拿......