USART介绍
USART通讯是一种广泛使用的在硬件上使用的异步通讯协议。
USART通信可以自定义通讯协议。
USART是串口通信,用于2台设备之间的直接通信,其接口接线方式:
USART通讯过程
数据不传输
当不传输数据时,UART数据传输线通常保持高电平。
起始位
开始数据传输,发送端的会将传输线从高电平拉到低电平并保持1个时钟周期,当接收端检测到高到低电压跃迁时,便开始以波特率对应的频率读取数据帧中的位。
数据帧
数据帧包含所传输的实际数据。如果使用奇偶校验位,数据帧长度可以是5位到8位。
在不使用奇偶校验位的情况下,数据帧长度可以是9位。
在大多数情况下,数据以最低有效位优先方式发送。
奇偶校验
由于数据传输可以受到各种不确定因素导致出错,就需要使用奇偶校验来一定程度上确保数据的稳定性。
接收端读取数据帧后,将计数值为1的位,检查总数是偶数还是奇数。如果奇偶校验位为0(偶数奇偶校验),则数据帧中的1或逻辑高位总计应为偶数。如果奇偶校验位为1(奇数奇偶校验),则数据帧中的1或逻辑高位总计应为奇数。
当奇偶校验位与数据匹配时,UART会认为传输未出错。但是,如果奇偶校验位为0,而总和为奇数,或者奇偶校验位为1,而总和为偶数,则UART认为数据帧中的位已改变。
停止位
发送端将数据传输线从低电压驱动到高电压并保持1到2位时间。
使用USART通讯
在HAL库中,已经封装了对USART通讯的发送和接收函数,这里提供介绍。
数据类型
HAL_StatusTypeDef
枚举类型,表示USART串口状态
c
1234567
typedef enum { HAL_OK = 0x00U, // 成功 HAL_ERROR = 0x01U, // 错误 HAL_BUSY = 0x02U, // 繁忙 HAL_TIMEOUT = 0x03U // 超时 } HAL_StatusTypeDef;
函数介绍
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
此函数是一个中断函数,当发送端有消息发送时,就会触发此中断(此函数需要自己定义)。
参数(UART_HandleTypeDef *huart)USART串口编号,常用于区分不同的Usart串口的消息
返回值:无
示例:
c
1234567891011
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART1) { // USART1消息 } else if (huart->Instance == USART2) { // USART2消息 } }
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
此函数用于开启某USART串口通信中断,来接收消息。
参数(UART_HandleTypeDef *huart)USART串口编号
参数(uint8_t *pData)接收数据缓冲区
参数(uint16_t Size)缓冲区大小
返回值:USART串口状态枚举类型(HAL_StatusTypeDef)
示例:
1234567
uint8_t __Usart1_Buffer; uint8_t __Usart2_Buffer; // 开启USART1串口通信 HAL_UART_Receive_IT(&huart1, &__Usart1_Buffer, 1); // 开启USART2串口通信 HAL_UART_Receive_IT(&huart2, &__Usart2_Buffer, 1);
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)
此函数用于发送数据。
参数(UART_HandleTypeDef *huart)USART串口编号
参数(uint8_t *pData)发送的数据
参数(uint16_t Size)发送数据的大小
参数(uint32_t Timeout)超时时间,如果发送数据时,检测到串口繁忙,就会等待。
返回值:USART串口状态枚举类型(HAL_StatusTypeDef)
示例:
123
uint8_t message[] = "hello world"; // 通过USART1发送数据 HAL_UART_Transmit(&huart1, (uint8_t *)message, sizeof(message), 100);
文章来源以及下载地址:
USART通讯介绍,协议示例,使用方法以及HAL库示例代码 – 附2023年全国大学生电子设计竞赛(TI杯)电赛E题代码 - 晨醒云烟 (sober-up.cn)