UART相关知识总结

推荐一篇博文,文章对UART协议的解析非常棒!:
https://blog.csdn.net/update7/article/details/112852158

Ⅰ、简介

  • UART ==> 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)
  • UART是一个全双工的通信协议。

(1)UART的传输速率

(以下速率描述内容摘自https://blog.csdn.net/ss343fd/article/details/54880037

  • RS232:传输速率一般不超过20Kbps,速率低,抗干扰能力差,RS-232C能传输的最大距离不超过15m(50英尺)。

  • RS422:定义了一种平衡通信接口,将传输速率提高到10Mbps,传输距离延长到4000英尺(速率低于100Kbps时),并允许在一条平衡总线上连接最多10个接收器。RS-422是一种单机发送、多机接收的单向、平衡传输规范,被命名为TIA/EIA-422-A标准。

  • RS485:增加了多点、双向通信能力,即允许多个发送器连接到同一条总线上,同时增加了发送器的驱动能力和冲突保护特性,扩展了总线共模范围,后命名为TIA/EIA-485-A标准。最高传输速率10Mbps,抗干扰能力强,可以传距离1.5km。

平衡双绞线的长度与传输速率成反比,在100Kbps速率以下,才可能使用规定最长的电缆长度。只有在很短的距离下才能获得最高速率传输。一般100米长双绞线最大传输速率仅为1Mbps。

(2)UART与USART的区别

  • USART ⇒ USART:(Universal Synchronous/Asynchronous Receiver/Transmitter
    USART在通信线上,一般有四根管理数据发收的线,分别是TX、RX、CTS、RTS
    USART支持同步模式发收,可以做数据流控。就是通过CTS、RTS两根线进行流控管理。

  • UART ⇒ 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),仅支持异步发送。

(3)硬件接线注意

  • UART需要TX与RX相接,才可以进行数据通信。
  • 传统的TX、RX、GND接法,两个设备需要共地(GND)

Ⅱ、波特率

关于UART两个基本的概念:波特率、数据帧需要了解。
    波特率:单位为bps,意为 bit per second,即是每秒传送的bit的数量。串口常见的波特率为9600,14400,57600、115200等。

    以9600为例,意思为1秒传输了9600bit,那么传输1bit所用的时间为:1 /9600 ≈ 104us。这里计算出来的时间到底有何作用呢,可以理解为特定波特率下,UART的逻辑电平保持的时间长度,比如9600波特率下,发送bit 1,需要维持逻辑高电平104us,发送bit 0,则需要维持低电平104us。下文将会结合时序图进行分析。


Ⅲ、数据帧

    数据帧:UART的帧数据结构通常为,起始位(1bit)、数据位(5-8bit)、奇偶校验位(1bit 可选)、停止位(1/1.5/2 bit),一般UART不需要奇偶校验,发送8bit数据情况下,UART的一帧数据长度为10bit

    这里放一张UART帧数据的图示。(该图从参考博文中引用)
在这里插入图片描述
    图中所发UART数据为0x33 (二进制:0 11001100 1),由于数据是从低位(LSB)开始发送,所以实际上发送的数据为11001100的反序,即00110011 (0x33)。
    可以看到数据帧中,0(起始位1bit) 11001100(8bit数据) 1(停止位1bit) 这里省略了奇偶检验位。

(1)空闲位

    空闲位为1,表示逻辑高电平,当UART处于空闲状态时,一直保持高电平,发送数据结束时,最后恢复为高电平,即逻辑电平为1。

(2)起始位

起始位为0,表示逻辑低电平,占用1bit,当状态由空闲(高电平)->起始位(低电平),表示准备开始发送UART数据。这里就涉及到波特率的问题了,若想在9600波特率下表示起始位,则需要维持低电平时间至少104us左右
在这里插入图片描述

(3)数据位

    数据位一般为5-8bit,最常用的多为7bit、8bit,7bit可以传输一个ASCII码。8bit刚好是1字节数据。
    当起始位开始后,逻辑高电平表示bit 1,逻辑低电平表示bit 0,9600波特率下,电平时间同样需要维持至少104us左右。需要注意的是UART发送数据是采用LSB格式,即低位先发出。图中发送0x33,那么对应的数据格式的二进制为 1100 1100.

(4)奇偶检验位

    一般情况,可以不使用奇偶检验。即是加入奇偶校验位,只能判断数据传输出错并丢弃数据帧,但不可以像TCP协议一样触发重传机制。
    奇偶检验分为奇校验、偶校验。关于奇偶校验的理解,可以参考文章:https://zhuanlan.zhihu.com/p/29693940
    文章中奇偶校验的理解非常易懂:
    奇校验:保持除起始位外,数据中1的个数位奇数。如发送数据0x33(1100 1100),1100 1100中1的个数为4,奇校验为了保持1的总数为奇数,校验位需要再补一个1,从而使数据位与校验位1的总个数为5,为奇数。

(PS:下文两张奇偶校验图示从上述参考博文引入)
图示从上述参考博文中引入
    偶校验:保持除起始位外,数据中1的个数位偶数。同样道理。如发送 0x33 (1100 1100) 。数据位中,1的个数为4,已经是偶数,那么校验位则无需再补充1,填0即可。
图示从上述参考博文引入

(5)停止位

    停止位为逻辑高电平,表示一帧数据已经传输结束。9600波特率下,高电平至少维持104us。停止位有1、1.5、2bit。以这里的理解为高电平保持的时间,即分别是1 x 104us、1.5 x 104us、2 x 104us。

若想连续发送多帧UART数据,则每一帧数据都需要重复上述的过程,直至所有的数据帧发送完毕。


Ⅳ、总结

  1. 需要了解波特率的定义,bit per second,每秒发送的bit数,通过该概念可以算出电平维持时间,1秒/波特率

  2. 传输数据过程,为LSB,低位数据先发。逻辑高电平表示数据bit 1, 逻辑低电平表示数据bit 0.

  3. 空闲位,为高电平。

  4. 启动位,为低电平, 启动过程相当于从高电平(空闲位)切换至低电平,表示启动。

  5. 数据传输位数,5-8bit。

  6. 奇偶校验,非必要。 表示需要维持数据位中1的数量,奇数/偶数。 通过校验位来补全1的数量,为奇数或者偶数。

  7. 停止位有1、1.5、2bit,一般为1bit。

  8. 接线需要TX、RX反接,需要共GND。

  9. 数据帧格式 空闲位 + 起始位 + 5-8bit数据位 + 奇偶(可选) + 1/1.5/2bit的停止位

  • 4
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F429是一款基于ARM Cortex-M4内核的微控制器,它具有丰富的外设和高性能。UART是其中一种串行通信接口,用于在微控制器和外部设备之间传输数据。在STM32F429中,UART的配置和操作都是通过HAL库来完成的。 要使用UART功能,首先需要在stm32f4xx_hal_conf.h文件中启用UART相关的配置选项。然后,通过HAL库中的结构体USART_TypeDef来定义USART相关的寄存器。这些寄存器包括状态寄存器、数据寄存器、波特率寄存器和控制寄存器等。你可以在stm32h743xx.h文件中找到这个类型定义。 下面是一个使用UART的示例代码: ```c UART_HandleTypeDef UartHandle; // 定义一个UART句柄 // 配置UART参数 UartHandle.Instance = USART3; UartHandle.Init.BaudRate = 115200; UartHandle.Init.WordLength = UART_WORDLENGTH_8B; UartHandle.Init.StopBits = UART_STOPBITS_1; UartHandle.Init.Parity = UART_PARITY_NONE; UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE; UartHandle.Init.Mode = UART_MODE_TX_RX; UartHandle.Init.OverSampling = UART_OVERSAMPLING_16; // 初始化UART句柄 if (HAL_UART_Init(&UartHandle) != HAL_OK) { Error_Handler(); } // 使用UART发送数据 uint8_t data[] = "Hello, World!"; if (HAL_UART_Transmit(&UartHandle, data, sizeof(data), HAL_MAX_DELAY) != HAL_OK) { Error_Handler(); } ``` 在上述代码中,我们首先定义了一个名为UartHandle的UART句柄,并配置了UART参数。然后使用HAL_UART_Init函数来初始化UART句柄。接下来,我们使用HAL_UART_Transmit函数发送数据到UART总结起来,STM32F429的UART功能可以通过配置相关参数和使用HAL库的函数来实现串口通信。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【STM32F429开发板用户手册】第23章 STM32F429的USART串口基础知识和HAL库API](https://blog.csdn.net/Simon223/article/details/107470485)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值