1、串口的模式有3种,一是查询模式,二是中断模式,三是DMA模式
HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制
HAL_UART_Receive();串口轮询模式接收,使用超时管理机制
HAL_UART_Transmit_IT();串口中断模式发送
HAL_UART_Receive_IT();串口中断模式接收
HAL_UART_Transmit_DMA();串口DMA模式发送
HAL_UART_Transmit_DMA();串口DMA模式接收
2、阻塞传输是调用这个函数并在等待时间内一直等待操作完成。
HAL_UART_Transmit
HAL_UART_Receive
查询的方式一般少用,这里不做过多介绍。
3、串口中断
串口中断函数
HAL_UART_TxHalfCpltCallback();一半数据发送完成时调用
HAL_UART_TxCpltCallback();数据完全发送完成后调用
HAL_UART_RxHalfCpltCallback();一半数据接收完成时调用
HAL_UART_RxCpltCallback();数据完全接受完成后调用
HAL_UART_ErrorCallback();传输出现错误时调用
定义相关变量
uint8_t RxBuffer;//接收中断缓存
uint8_t Uart_RxBuffer[256];//接收中断
uint8_t Uart_RX_Cnt = 0;//接收中断计数
uint8_t AlmStr[]="Uart1数据溢出(大于256)!rn";//UART1 错误信息输出
在主循环外开启中断
HAL_UART_Receive_IT(&huart1,(uint8_t*)&RxBuffer,1);//开启接收中断
串口接收回调函数
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(huart);
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_UART_TxCpltCallback could be implemented in the user file
*/
if(Uart_RX_Cnt >= 255) //溢出判断
{
Uart_RX_Cnt = 0;
memset(Uart_RxBuffer,0x00,sizeof(Uart_RxBuffer));//清空缓存,记得#include "string.h"
HAL_UART_Transmit(&huart1, (uint8_t *)&AlmStr, sizeof(AlmStr),0xFFFF);
}
else
{
Uart_RxBuffer[Uart_RX_Cnt++] = RxBuffer; //接收数据转存
if((Uart_RxBuffer[Uart_RX_Cnt-1] == 0x0A)&&(Uart_RxBuffer[Uart_RX_Cnt-2] == 0x0D)) //判断结束位
{
HAL_UART_Transmit(&huart1, (uint8_t *)&Uart_RxBuffer, Uart_RX_Cnt,0xFFFF); //将收到的信息发送出去
Uart_RX_Cnt = 0;
memset(Uart_RxBuffer,0x00,sizeof(Uart_RxBuffer)); //清空数组
}
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&RxBuffer, 1); //再开启接收中断
}
/* USER CODE END 4 */
到这里中断方式的串口接收完成。
上一篇:基于STM32CubeMX&HAL库写代码之串口
下一篇:STM32CubeMX:UART操作
推荐阅读最新更新时间:2024-11-16 21:31