USART通讯介绍,协议示例,使用方法以及HAL库示例代码 – 附2023年全国大学生电子设计竞赛(TI杯)电赛E题代码

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)

  • 16
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

STHUDY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值