串行通信——UART总结

1. 什么是UART通信协议?

UART是异步,全双工串口总线。它比同步串口复杂很多。有两根线,一根TXD用于发送,一根RXD用于接收。UART的串行数据传输不需要使用时钟信号来同步传输,而是依赖于发送设备和接收设备之间预定义的配置。

UART全称是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),它通常称作UART,是一种异步收发传输器, 是设备间进行异步通信的关键模块。UART负责处理数据总线和串行口之间的串/并、并/串转换,并规定了帧格式;通信双方只要采用相同的帧格式和波特率,就能在未共享时钟信号的情况下,仅用两根信号线(RX 和TX)就可以完成通信过程,因此也称为异步串行通信

2. UART协议具体介绍

(1)UART数据传输的格式

数据传送速率用波特率来表示,即每秒钟传送的二进制位数。例如数据传送速率为120字符/秒,而每一个字符为10位(1个起始位,7个数据位,1个校验位,1个结束位),则其传送的波特率为10×120=1200字符/秒=1200波特。

其中各位的意义如下:

起始位:先发出一个逻辑”0”信号,表示传输字符的开始;

数据位:可以是5~8位逻辑”0”或”1”;如ASCII码(7位),扩展BCD码(8位);小端传输,即LSB先发,MSB后发;

校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验);

停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平(用于双方同步,停止位时间间隔越长,容错能力越强);

空闲位:处于逻辑“1”状态,表示当前线路上没有数据传送;

注意:异步通信是按字符传输的,接收设备在收到起始信号之后只要在一个字符的传输时间内能和发送设备保持同步就能正确接收。下一个字符起始位的到来又使同步重新校准(依靠检测起始位来实现发送与接收方的时钟自同步的)。

(2)波特率和比特率的区别

1.1 波特率:波特率(Baud Rate)指的是每秒传送的信号变化次数。它表示了一个数字信号传输中的速度,通常以波特(baud)为单位来衡量。波特率决定了信息传输的速度和可靠性。

1.2 比特率:比特率(Bit Rate)指的是每秒传送的比特数。比特率是指数据信号的速度,也称为位速或传输速率。比特率通常以比特每秒(bps)为单位来衡量。比特率决定了信号传输的容量和速率。1、波特率就是每秒传输多少符号2、比特率就是每秒传输多少比特。二进制一个符号所含信息量为1比特,因此二进制下波特率=比特率。 计算机处理的都是二进制数,在这个环境下波特率和比特率都一样。

波特率和比特率是通信领域中重要的概念。波特率指的是每秒传送的信号变化次数,而比特率指的是每秒传送的比特数。尽管在理想情况下两者相等,但实际应用中,波特率可以大于比特率。了解波特率和比特率的定义、关系和区别,有助于我们更好地理解数字和模拟通信中的数据传输速度和效率。

(3)UART电平标准

UART使用标准的TTL/CMOS逻辑电平(0-5v,0-3.3v,0-2.5v或0-1.8v)来表示数据,1表示高电平,0表示低电平。为了提高抗干扰能力、提高传输的距离,通常也会TTL/CMOS逻辑电平转换为RS-232逻辑电平,3-15表示0,-3~-15V表示1。

举个例子,对于传输数据0x55,即二进制的01010101,RS232和TTL的区别如下:

(4)UART工作原理

发送数据过程:空闲状态,线路处于高电平;当收到发送指令后,拉低线路的一个数据位的时间T,接着数据按低位到高位依次发送,数据发送完毕后,接着发送奇偶校验位和停止位,一帧数据发送完成。

数据接收过程:空闲状态,线路处于高电平;当检测到线路的下降沿(高电平变为低电平)时说明线路有数据传输,按照约定的波特率从低位到高位接收数据,数据接收完毕后,接着接收并比较奇偶校验位是否正确,如果正确则通知后续设备接收数据或存入缓冲。

由于UART是异步传输,没有传输同步时钟,为了保证数据的正确性,UART采用16倍数据波特率的时钟进行采样。每个数据有16个时钟采样,取中间的采样值,以保证采样不会滑码或误吗。一般UART一帧的数据位数为8,这样即使每个数据有一个时钟的误差,接收端也能正确地采样到数据。

UART的接收数据时序为:当检测到数据的下降沿时,表明线路上有数据进行传输,这是计数器CNT开始计数,当计数器为24=16+8时,采样的值为第0位数据;当计数器的值为40时,采样的值为第一位数据,依次类推,进行后面6个数据的采样。如果需要进行奇偶校验,则当计数器的值为152时,采样的值即为奇偶位;当计数器的值为168时,采样的值为“1”表示停止位,数据接收完成。

一个标准的10位异步串行通信协议(1个起始位、1个停止位和8个数据位)收发时序,如下图所示:

3. UART的优缺点

优点:1、通信只需要两条数据线。2、无需时钟信号。3、有奇偶校验位,方便通信的差错检查。4、只需要接收端和发送端设置好数据包结构,即可稳定通信。缺点:1、传输速率较低。2、接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。3、传输距离有限,数据帧最大支持9位数据。

UART(通用异步收发器)是一种常见的设备间通信协议,它的工作原理是将传输数据的每个二进制位一位接一位地传输。然而,UART的效率可能会相对较低,主要原因如下:

  1. 串行传输:UART使用串行通信,即数据通过单条线路或导线逐位传输。这意味着数据必须一个接一个地发送,而不是像并行通信那样同时发送。这可能会降低数据传输的速度。
  2. 起始位和停止位:UART协议规定,每个字符的开始和结束都需要一个起始位和一个或多个停止位。这些额外的位会占用传输时间,从而降低了有效数据的传输速率。
  3. 奇偶校验:为了检测数据传输过程中可能出现的错误,UART通常会使用奇偶校验。这需要额外的校验位,进一步减少了有效数据的传输速率。
  4. 异步通信:UART是异步通信协议,这意味着发送器和接收器之间没有共享的时钟信号来同步数据。因此,两个设备必须事先约定好相同的波特率(即每秒钟传送的二进制位数)。如果两台设备的波特率有所不同,可能会导致接收错误。
  5. 长距离通信:在长距离通信中,电磁干扰和线路阻抗可能会导致数据错误,从而需要重发数据包,这也会降低UART的效率。

尽管UART在某些方面效率较低,但其优点是通信线路简单,利用简单的线缆就可实现通信,降低成本,适用于远距离通信。此外,由于其设计简单和易于实现,UART在嵌入式系统中仍然广泛使用。

4. UART使用示例

以下是一个简化的示例来说明这两种通信方式在STM32微控制器上的代码框架:

UART(通用异步收发传输器):

STM32 HAL库配置与使用:
// 首先包含必要的头文件
#include "stm32f4xx_hal.h"

// 初始化UART实例
void UART_Init(UART_HandleTypeDef *huart) {
    huart->Instance = USARTx; // 选择具体的USART引脚,例如USART1
    huart->Init.BaudRate = 9600; // 设置波特率
    huart->Init.WordLength = UART_WORDLENGTH_8B; // 数据位数为8位
    huart->Init.StopBits = UART_STOPBITS_1; // 停止位为1位
    huart->Init.Parity = UART_PARITY_NONE; // 无奇偶校验
    huart->Init.Mode = UART_MODE_TX_RX; // 全双工模式
    huart->Init.HwFlowCtl = UART_HWCONTROL_NONE; // 无硬件流控

    HAL_UART_Init(huart); // 调用HAL库函数完成初始化
}

// 发送数据
void UART_Transmit(UART_HandleTypeDef *huart, uint8_t *data, uint16_t size) {
    HAL_UART_Transmit(huart, data, size, HAL_MAX_DELAY);
}

// 接收数据(回调或中断服务函数)
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
    uint8_t received_data;
    // 在这里获取接收到的数据
    received_data = huart->pRxBuffPtr[0];
    // 处理接收到的数据...
    // 清除中断标志并重新开始接收
    __HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);
}

// 开始接收
HAL_StatusTypeDef UART_StartReceive(UART_HandleTypeDef *huart, uint8_t *rx_buffer, uint16_t size) {
    huart->pRxBuffPtr = rx_buffer;
    huart->RxXferSize = size;
    return HAL_UART_Receive_IT(huart, rx_buffer, size);
}
  • 28
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UART串口通信中,有一些与初始化和控制相关的寄存器。其中包括UARTx_UCR1~4,这些是串口配置寄存器,用于设置串口的参数,如使能、数据位位数、停止位位数等。另外,还有UARTx_USR1~2,这些是串口状态寄存器,可用于判断是否接收到数据、数据是否发送完毕等。此外,还有UARTx_UFCR、UARTx_UBIR、UARTx_UBMR这几个寄存器,它们搭配使用,用于配置波特率。 总结起来,通过这些寄存器的配置,可以控制和管理UART串口通信的初始化和传输过程,实现数据的发送和接收。 UART是一种全双工、异步串行通信方式,通过将并行数据转换成串行数据来传输,同时将接收到的串行数据转换成并行数据来接收,实现了全双工传输和接收。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【裸机开发】UART 串口通信(一)—— 寄存器解析](https://blog.csdn.net/challenglistic/article/details/131435415)[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_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [UART串口通信协议](https://blog.csdn.net/STATEABC/article/details/131808646)[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_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值