基于HAL实现STM32串口中断接收。
MCU:STM32F103C8T6
HAL:STM32Cube_FW_F1_V1.8.4
用到的串口相关函数
串口发送数据
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout) |
串口发送指定长度的数据,若超时没完成发送,则停止发送并返回超时标志(HAL_TIMEOUT
)。
UART_HandleTypeDef *huart
:使用的串口的别名uint8_t *pData
:待发送的数据uint16_t Size
:待发送数据的长度(单位:字节)uint32_t Timeout
:最大发送时间
串口中断接收数据
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) |
串口中断接收指定长度的数据;串口接收到数据时,触发串口中断,直至接收完指定长度的数据,关闭中断,进入接收中断回调函数,只触发一次中断。
UART_HandleTypeDef *huart
:使用的串口的别名uint8_t *pData
:存储接收到的数据uint16_t Size
:接收到的数据的长度
接收中断回调函数
__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) |
弱函数,我在main.c
文件中重新定义。
串口状态查询函数
HAL_UART_StateTypeDef HAL_UART_GetState(UART_HandleTypeDef *huart) |
判断数据接收或发送是否完成。
STM32CubeMX配置
选择USART1
,工作模式选择为异步通信(Asynchronous
),波特率设置为115200,每帧数据字长8比特,无奇偶校验,停止位为1比特,数据传输方向为接收和发送
,还需要允许USART1
触发中断;其它设置照旧不变。
程序源码
在main.c
文件中引用头文件string.h
,因为需要清空数组(数组保存了接收到的数据);
在main.c
文件中定义变量;
char RX_Buffer[64]; //接收到的数据,最大接收64字节 |
还是main.c
文件,在主函数下调用一次接收中断函数;
HAL_UART_Receive_IT(&huart1,(uint8_t *)&RX_Buffer_Interrupt,1); |
main.c
文件末尾处自定义接收中断回调函数;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) //接收中断回调函数 |
运行结果
单次发送数据不超过64字节;
单次发送数据超过64字节。
避坑:MCU核心板需要由USB转TTL模块供电(5V),否则,数据无法正常收发。
参考资料: