HAL库与基本库面对USART接收不定长数据的实现方法比较

文章介绍了如何在使用HAL库时,利用USART的IDLE中断标志接收不定长数据,以及通过回调函数和DMA优化接收过程。首先展示了基础库实现方法,然后介绍了通过添加接收完成和空闲中断回调函数来简化处理协议解析和DMA控制。
摘要由CSDN通过智能技术生成

项目场景:

HAL库使用USART时,更便捷的使用IDLE中断标志位接收不定长数据。


基础库实现方法

中断函数添加如下:

	if (__HAL_UART_GET_FLAG(&huart2,USART_ISR_ORE))
	{
		__HAL_UART_CLEAR_OREFLAG(&huart2); 
		
		Usrt2_Rx_Flag = 0;
		Usrt2_Rx_Cnt = 0;
	}
	
	if (__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE))
	{
		__HAL_UART_CLEAR_IDLEFLAG(&huart2); 
		Usrt2_Rx_Flag = 1;
		Usrt2_Rx_Cnt = 0;
	}
	if (__HAL_UART_GET_FLAG(&huart2,UART_FLAG_RXNE))
	{
		__HAL_UART_CLEAR_FLAG(&huart2,UART_FLAG_RXNE); 
		
		Usrt2_Rx_Data[Usrt2_Rx_Cnt] = USART2->RDR;
		
		if (Usrt2_Rx_Cnt < 10) Usrt2_Rx_Cnt++;
		else
		{
			Usrt2_Rx_Cnt = 0;
			Usrt2_Rx_Flag = 1;
		}
	}

HAL库实现方法

通过添加回调函数实现,中断函数添加如下:
	if (__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE))
	{
		__HAL_UART_CLEAR_IDLEFLAG(&huart2); 

  	  USAR_UART_IDLECallback(&huart2);  
		
		Usrt2_Rx_Flag = 1;
		Usrt2_Rx_Cnt = 0;
	}

添加接收完成回调函数:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
	if (huart->Instance == USART1) {
		RS485_Recive();  // 协议解析
	}
	if (huart->Instance == USART2) {
		UART2_Recive();	   // 协议解析
	}
}

添加空闲中断回调函数:

void USAR_UART_IDLECallback(UART_HandleTypeDef *huart)
{ 
  if  (huart->Instance == USART1) {
    HAL_UART_DMAStop(&huart1);      //停止本次DMA传输
    // memset(Usrt2_Rx_Data,0,10);                                         //清零接收缓冲区
    HAL_UART_Receive_DMA(&huart1, Usrt1.R_Data, 8);  //重启开始DMA传输 每次8字节数据
  }
  if (huart->Instance == USART2) {
    HAL_UART_DMAStop(&huart2);    //停止本次DMA传输
    // memset(Usrt2_Rx_Data,0,10);                                         //清零接收缓冲区
    HAL_UART_Receive_DMA(&huart2, Usrt2_Rx_Data, 10);  //重启开始DMA传输 每次10字节数据
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值