HAL库实践记录之串口接收不定长数据

串口1接收不定长数据

实验板是原子mini板

一开始使用官方库,只能接受定长数据。把数据长度设置为1时,发送多字节数据时又会丢数。所以自己重写串口中断处理函数。

首先搞一下Cube配置用法:Mode选异步,下边设置好参数。

HAL库实践记录之串口接收不定长数据_第1张图片

设置串口中断

HAL库实践记录之串口接收不定长数据_第2张图片

然后就配置完了。生成代码

第一步在主函数初始化阶段添加如下代码

__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);//开串口1中断

第二步,删除官方库函数,添加自己的中断函数(如果再生成代码的话要再删除一次官方函数的调用)

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
	user_Uart1Handler();
	//stm32Mxcube重新配置生成代码后需要注释掉函数void USART1_IRQHandler(void)中的HAL_UART_IRQHandler(&huart1);就是下面这句
  /* USER CODE END USART1_IRQn 0 */
  //HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
		
  /* USER CODE END USART1_IRQn 1 */
}

第三步,重写函数,如下

void user_Uart1Handler(void)
{
	//接收寄存器非空
	if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE)!=RESET))  
	{
		USART1_RX_BUF[USART1_RX_BUF_Index]=(uint8_t)(huart1.Instance->DR & (uint8_t)0x00FF);
		USART1_RX_BUF_Index++;

		__HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_RXNE);
	}
	else
	{
		
	}		
		  
	
}

这样就能就收了。

我也是借鉴了其他帖子,一般都是用DMA或者空闲中断,我都不太了解就没用。我用标准库的时候就是这么写的检查非空,保存数据,然后把非空标志清除。先用着等遇到其他问题的时候再解决。

你可能感兴趣的:(stm32-HAL库)