STM32Cube串口中断只执行一次问题

文章探讨了在STM32F4微控制器中,通过使用中断通信方式解决轮询接收数据偶尔错包的问题。作者在USART3_IRQHandler函数中重写了接收完成回调,确保正确处理多个数据包,并成功避免了丢包。提到对于不定长数据,需要逐位接收并解包。
摘要由CSDN通过智能技术生成

1-使用轮询10ms超时,buf_len定长17,发现偶尔会错包导致丢失一个数据,所以想测试一下中断通信方式
2-使用中断的时候发现在HAL_UART_RxCpltCallback此函数内使用HAL_UART_Receive_IT重新开启中断,发现还是只能触发一次
解决办法:在stm32f4xx_it.c里找到USART3_IRQHandler函数,并
HAL_UART_Receive_IT添加在里面,如下:

void USART3_IRQHandler(void)
{
  /* USER CODE BEGIN USART3_IRQn 0 */

  /* USER CODE END USART3_IRQn 0 */
  HAL_UART_IRQHandler(&huart3);
  /* USER CODE BEGIN USART3_IRQn 1 */
  HAL_UART_Receive_IT(&huart3, &data_buf, 17);

  /* USER CODE END USART3_IRQn 1 */
}

重写void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
	/* 判断是哪个串口触发的中断 */
	if(huart ->Instance == USART3) {
		for (int i = 0; i < sizeof(data_buf); i++) {
		
		} 
		// 解包代码
		memset(data_buf, 0x00, sizeof(data_buf));
//		HAL_UART_Receive_IT(&huart3, &data_buf, 17);
			}
		}
	}
}

main.c启用中断

  MX_USART3_UART_Init();
  	memset(data_buf, 0x00, sizeof(data_buf));
	HAL_UART_Receive_IT(&huart3, data_buf, 17);

经测试无问题,并没在出现错包丢包问题,用的是定长17,如果是不定长的,需要一位一位接收,然后根据自定协议解包打包

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值