基于HAL库处理UART中断并接收串口传入的数据

本文介绍了如何使用STM32F107的HAL库进行UART4串口的数据接收和发送操作。主要内容包括利用HAL_UART_GetState函数检查接收状态、通过HAL_UART_Receive函数读取数据并存储到自定义数组中,最后通过HAL_UART_Transmit函数发送数据。


研究了下HAL库,在百度上面找发现很多UART串口接收,串口中断处理是从USART那边直接抄过来的,使用的是标准库一类的,在用HAL库配置的工程中完全没法使用,另辟蹊径,通过在文档中翻找HAL打头的函数发现已经有十分简单的封装了。


正确的获取接收数据的方法是:

1.在进入中断后使用HAL库函数中的HAL_UART_GetState函数确定UART的接收是否结束,这个函数也可以判断发送数据是否忙碌等(HAL_UART_BUSY_xx)

2.处理缓存中的数据,提取保存到自定义的变量数组中,用HAL_UART_Receive函数实现

3.重置中断标志位



这一个函数演示了UART4如何正确的接收数据,再发送回去,平台是STM32F107

void UART4_IRQHandler(void)
{
uint8_t res[50];
unsigned int i;//定义一个变量,在后面以为用
 HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_3);
while(HAL_UART_GetState(&huart4) == HAL_UART_STATE_BUSY_RX)
{}
  HAL_UART_Receive(&huart4,res,strlen(res),0xFFFF);
  HAL_UART_Transmit(&huart4,res,strlen(res),0xFFFF);
	
                                            
 HAL_UART_IRQHandler(&huart4);
    __HAL_UART_ENABLE_IT(&huart4, UART_IT_ERR);
    __HAL_UART_ENABLE_IT(&huart4, UART_IT_RXNE);

}





### 关于STM32 HAL中使用DMA进行串口中断接收STM32 HAL中,利用DMA进行串口数据中断接收主要依赖几个核心函数。这些函数允许开发者配置启动基于DMA的数据传输过程,在接收到指定数量的数据后触发回调处理程序。 #### 初始化UART外设与DMA通道 为了使能DMA功能用于串口通信,首先需要初始化相应的UART接口以及分配给它的DMA资源。这一步骤通常是在`MX_USARTx_UART_Init()`函数内部完成,其中包含了设置波特率、字长等参数的操作[^1]。 ```c // USART初始化结构体定义 static void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; // 设置为收发模式 huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; if (HAL_UART_Init(&huart1) != HAL_OK){ Error_Handler(); } } ``` #### 启动DMA接收操作 当硬件准备就绪之后,可以调用`HAL_UART_Receive_DMA()`来开启一次性的DMA接收任务。此API会自动关联之前设定好的DMA流/通道到UART设备上,等待外部输入直到缓冲区满载或是遇到错误条件为止[^2]。 ```c uint8_t aRxBuffer[RXBUFFERSIZE]; if(HAL_UART_Receive_DMA(&huart1, (uint8_t *)aRxBuffer, RXBUFFERSIZE)!= HAL_OK){ /* Transfer error in reception */ Error_Handler(); } ``` #### 处理接收完成事件 每当DMA成功转移了一帧完整的消息至内存空间内时,就会激活预注册过的回调机制——即`HAL_UART_RxCpltCallback()`。该方法由用户自定义实现逻辑,负责解析新到达的信息包且决定下一步动作是什么样式的响应行为。 ```c void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance==USART1){ // 用户自定义处理代码... // 如果还需要继续监听更多传入的消息,则重新发起新一轮的DMA读取请求 if(HAL_UART_Receive_DMA(&huart1, (uint8_t *)aRxBuffer, RXBUFFERSIZE)!= HAL_OK){ Error_Handler(); } } } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值