STM32解决串口频繁接收串口死所问题

最近在使用STM32空闲中断接收数据的时候发现一旦发送端发送数据较频繁,串口就会出现死锁的情况,即使在接收到数据以后关闭空闲中断,解析完数据后立马打开中断,也会有这个情况。修改串口解析后打开中断部分内容后解决此问题,详解如下:

CubeMX串口配置如下:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
修改后内容如下:
stm32fl0xx_it.c

#define RECV_BUFFER_SIZE  20

uint8_t uart_dma_recv_buff[RECV_BUFFER_SIZE] = {0};
uint8_t uart_dma_recv_buff_bak[RECV_BUFFER_SIZE] = {0}

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */

  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
		if(RESET != __HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE))//Check whether the specified UART flag is set or not.
	{
		__HAL_UART_CLEAR_IDLEFLAG(&huart1);//Clear the UART IDLE pending flag.(Otherwise it will continue to interrupt)
//		HAL_UART_DMAStop(&huart1); 
		/*关闭接收的DMA*/
		ret_Value = HAL_IS_BIT_SET(huart1.Instance->CR3, USART_CR3_DMAR);
		if ((huart1.RxState == HAL_UART_STATE_BUSY_RX) && ret_Value)
		{
			CLEAR_BIT(huart1.Instance->CR3, USART_CR3_DMAR);

			/* Abort the UART DMA Rx stream */
			if (huart1.hdmarx != NULL)
			{
				HAL_DMA_Abort(huart1.hdmarx);
			}
			CLEAR_BIT(huart1.Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
			CLEAR_BIT(huart1.Instance->CR3, USART_CR3_EIE);

			/* At end of Rx process, restore huart->RxState to Ready */
			huart1.RxState = HAL_UART_STATE_READY;
		}		
		/*******************/
		Uart_recv_len = RECV_BUFFER_SIZE - (__HAL_DMA_GET_COUNTER(&hdma_usart1_rx));//获取接收数据的长度
		Uart_recv_flag = 1;
		memset(uart_dma_recv_buff_bak,0,RECV_BUFFER_SIZE);
		memcpy(uart_dma_recv_buff_bak,uart_dma_recv_buff,RECV_BUFFER_SIZE);
		memset(uart_dma_recv_buff,0,RECV_BUFFER_SIZE);
		__HAL_UART_DISABLE_IT(&huart1, UART_IT_IDLE);//关闭空闲中断
	}

接收打开中断部分:
main.c

if (Uart_recv_flag == 1) //串口接收到信恿
	{
		Uart_recv_flag = 0;
		
		/*此处解析接收到的数据*/
		
		HAL_UART_AbortReceive(&huart1); 
		HAL_UART_MspInit(&huart1);
		memset(uart_dma_recv_buff_bak,0,RECV_BUFFER_SIZE);
		HAL_UART_Receive_DMA(&huart1, (uint8_t*)uart_dma_recv_buff, RECV_BUFFER_SIZE); 
		__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
	}
}

小白一枚,有问题希望大家多多指正

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
stm32是一款广泛使用的嵌入式微控制器,可以使用串口进行通信。在串口接收数据时,可以选择阻塞接收中断接收两种方式。下面我来比较一下它们的优势。 首先是串口阻塞接收。阻塞接收是指程序在接收数据时需等待数据的到达,而后才能继续执行其他任务。这种方式简单易实现,对于一些对实时性要求不高的场景可以比较适用。例如在调试过程中,可以使用阻塞接收方式来接收外设发送的调试信息。此外,阻塞接收方式还能够较好地保证数据的完整性,因为程序能够等待并获取到完整的数据包。 然而,阻塞接收方式也存在一些弊端。首先,它具有较高的时间开销。当系统需要处理多个任务时,阻塞接收可能会造成任务延迟,影响系统的实时性。其次,如果数据包较大,阻塞接收可能导致数据丢失的风险。因为阻塞接收是在接收到完整的数据后再进行处理,当数据的到达速度超过处理速度时,就有可能造成数据丢失。 接下来是串口中断接收中断接收是指当串口接收到数据后,会引发一个中断,使得程序暂停当前执行的任务,去处理接收到的数据。相比于阻塞接收中断接收具有更低的时间开销。因为程序不需要等待数据的到达,而是在数据到达后立即进行处理。这使得中断接收方式特别适用于对实时性要求较高的场景,如传感器采集、数据采集等。 然而,中断接收方式也存在一些弊端。首先,中断处理函数需要消耗一定的处理时间,如果频繁地发生中断,可能会占用过多的处理器资源。其次,中断接收可能导致数据丢失的风险。因为中断处理函数需要一定的时间执行,如果数据的到达速度高于中断处理速度,就有可能造成数据丢失。 综上所述,串口阻塞接收中断接收各有优劣。选择合适的接收方式,需要根据具体的应用场景和对实时性、数据完整性等要求进行综合考虑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值