串口中断IDLE接收,不使用DMA

之前在网上看到有DMA传输接收不定长数据,使用到IDLE中断。这次使用串口中断接收不定长数据,通过IDLE中断的标志位

新手上路,想试试写个博客,记录一下自己学的东西。

在大佬的帖子上学习到的使用DMA及IDLE中断接收大量不定长数据的方法。但现在我要接收的只是很短的不定长数据,就想不使用DMA,用串口中断接收及IDLE的方式接收数据。
大佬的链接:
链接: link.

下面是我自己写的使用串口中断和IDLE中断接收不定长数据的方法。

使用cubeMX创建工程,打开串口中断。
我使用的STM32L1系列芯片,开启串口中断

串口3中断接收初始化,IDLE中断初始化

__HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);
HAL_UART_Receive_IT(&huart3, (uint8_t *)&RxByte, 1);

定义变量

uint8_t RxByte;//串口接收到的一个字节数据
uint8_t count=0;//串口接收数据个数
uint8_t UART3_RxBuffer[50];//将串口接收到的数据存入数组中
uint8_t recv_end_flag=0;//串口接收完成标志位

添加回调函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
 	if(huart->Instance==USART3)//如果是串口3
	{
		UART3_RxBuffer[count++] = RxByte;   //接收数据转存
		HAL_UART_Receive_IT(&huart3, (uint8_t *)&RxByte, 1);   //再开启接收中断
	}
}

stm32l1xx_it.c中的串口3中断函数USART3_IRQHandler中添加读取IDLE标志位的代码

void USART3_IRQHandler(void)
{
  /* USER CODE BEGIN USART3_IRQn 0 */
	uint32_t tmp_flag=0;
	tmp_flag =__HAL_UART_GET_FLAG(&huart3,UART_FLAG_IDLE);//读取IDLE中断标志位
	if((tmp_flag != RESET))//idle标志被置位
    {
		__HAL_UART_CLEAR_IDLEFLAG(&huart3);//清除IDLE标志位
		recv_end_flag = 1;//接收完成标志位
	}
  /* USER CODE END USART3_IRQn 0 */
  HAL_UART_IRQHandler(&huart3);
  /* USER CODE BEGIN USART3_IRQn 1 */
  /* USER CODE END USART3_IRQn 1 */
}

主函数

int main(void)
{
  /* USER CODE BEGIN 1 */
  /* USER CODE END 1 */
  /* MCU Configuration--------------------------------------------------------*/
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  /* USER CODE BEGIN Init */
  /* USER CODE END Init */
  /* Configure the system clock */
  SystemClock_Config();
  /* USER CODE BEGIN SysInit */
  /* USER CODE END SysInit */
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART3_UART_Init();
  /* USER CODE BEGIN 2 */
	__HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);
	HAL_UART_Receive_IT(&huart3, (uint8_t *)&RxByte, 1);
  /* USER CODE END 2 */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
		if(recv_end_flag==1)//如果接收完成
		{
				recv_end_flag=0;//接收标志位复位
				HAL_UART_Transmit(&huart3, UART3_RxBuffer, count, 1000);//将接收到的数据通过串口发送回去
				count=0;//清空接收计数
				memset(UART3_RxBuffer,0x00,sizeof(UART3_RxBuffer));//清除接收数组
		}
  }
  /* USER CODE END 3 */
}

结果在这里插入图片描述

随机发送的数据完整发送回来。

源代码链接: https://pan.baidu.com/s/1aBkpL_JwlDoKMgWpwvccZA
提取码:vapt

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值