赞
踩
UART是异步,全双工串口总线。它比同步串口复杂很多。有两根线,一根TXD用于发送,一根RXD用于接收。UART的串行数据传输不需要使用时钟信号来同步传输,而是依赖于发送设备和接收设备之间预定义的配置。
UART全称是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),它通常称作UART,是一种异步收发传输器, 是设备间进行异步通信的关键模块。UART负责处理数据总线和串行口之间的串/并、并/串转换,并规定了帧格式;通信双方只要采用相同的帧格式和波特率,就能在未共享时钟信号的情况下,仅用两根信号线(RX 和TX)就可以完成通信过程,因此也称为异步串行通信。
数据传送速率用波特率来表示,即每秒钟传送的二进制位数。例如数据传送速率为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”状态,表示当前线路上没有数据传送;
注意:异步通信是按字符传输的,接收设备在收到起始信号之后只要在一个字符的传输时间内能和发送设备保持同步就能正确接收。下一个字符起始位的到来又使同步重新校准(依靠检测起始位来实现发送与接收方的时钟自同步的)。
1.1 波特率:波特率(Baud Rate)指的是每秒传送的信号变化次数。它表示了一个数字信号传输中的速度,通常以波特(baud)为单位来衡量。波特率决定了信息传输的速度和可靠性。
1.2 比特率:比特率(Bit Rate)指的是每秒传送的比特数。比特率是指数据信号的速度,也称为位速或传输速率。比特率通常以比特每秒(bps)为单位来衡量。比特率决定了信号传输的容量和速率。1、波特率就是每秒传输多少符号2、比特率就是每秒传输多少比特。二进制一个符号所含信息量为1比特,因此二进制下波特率=比特率。 计算机处理的都是二进制数,在这个环境下波特率和比特率都一样。
波特率和比特率是通信领域中重要的概念。波特率指的是每秒传送的信号变化次数,而比特率指的是每秒传送的比特数。尽管在理想情况下两者相等,但实际应用中,波特率可以大于比特率。了解波特率和比特率的定义、关系和区别,有助于我们更好地理解数字和模拟通信中的数据传输速度和效率。
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的区别如下:
发送数据过程:空闲状态,线路处于高电平;当收到发送指令后,拉低线路的一个数据位的时间T,接着数据按低位到高位依次发送,数据发送完毕后,接着发送奇偶校验位和停止位,一帧数据发送完成。
数据接收过程:空闲状态,线路处于高电平;当检测到线路的下降沿(高电平变为低电平)时说明线路有数据传输,按照约定的波特率从低位到高位接收数据,数据接收完毕后,接着接收并比较奇偶校验位是否正确,如果正确则通知后续设备接收数据或存入缓冲。
由于UART是异步传输,没有传输同步时钟,为了保证数据的正确性,UART采用16倍数据波特率的时钟进行采样。每个数据有16个时钟采样,取中间的采样值,以保证采样不会滑码或误吗。一般UART一帧的数据位数为8,这样即使每个数据有一个时钟的误差,接收端也能正确地采样到数据。
UART的接收数据时序为:当检测到数据的下降沿时,表明线路上有数据进行传输,这是计数器CNT开始计数,当计数器为24=16+8时,采样的值为第0位数据;当计数器的值为40时,采样的值为第一位数据,依次类推,进行后面6个数据的采样。如果需要进行奇偶校验,则当计数器的值为152时,采样的值即为奇偶位;当计数器的值为168时,采样的值为“1”表示停止位,数据接收完成。
一个标准的10位异步串行通信协议(1个起始位、1个停止位和8个数据位)收发时序,如下图所示:
优点:1、通信只需要两条数据线。2、无需时钟信号。3、有奇偶校验位,方便通信的差错检查。4、只需要接收端和发送端设置好数据包结构,即可稳定通信。缺点:1、传输速率较低。2、接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。3、传输距离有限,数据帧最大支持9位数据。
UART(通用异步收发器)是一种常见的设备间通信协议,它的工作原理是将传输数据的每个二进制位一位接一位地传输。然而,UART的效率可能会相对较低,主要原因如下:
尽管UART在某些方面效率较低,但其优点是通信线路简单,利用简单的线缆就可实现通信,降低成本,适用于远距离通信。此外,由于其设计简单和易于实现,UART在嵌入式系统中仍然广泛使用。
以下是一个简化的示例来说明这两种通信方式在STM32微控制器上的代码框架:
- // 首先包含必要的头文件
- #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);
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。