stm32不定长接收

1.HAL库定长接收

HAL_UART_Receive(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size,

uint32_t Timeout)

huart:句柄

pData:盛放接收数据的变量

Size:接收数据的大小

Timeout:超时多久返回

接收完成后产生中断的接收函数

HAL_UART_Receive_IT(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)

huart:句柄

pData:盛放接收数据的变量

Size:接收数据的大小

传输结束后触发中断

HAL_UART_Receive_IT和HAL_UART_Receive的区别就是:中断接收是有数据到了才去读;直接接收是直接读取,如果超时就返回

这两个接收函数都是定长接收,规定接收数据长度后,当发送字符数长度超过约束,会有吞字符现象;当发送字符未达到size,则存在缓冲区,字符数达到规定后发出,实验如下图:

2.空闲中断+接收中断

没有数据交互的时候,电平归于高电平,此时空闲中断标志位被置1。在数据线处于空闲的状态时(即数据传输结束),空闲中断被置1,空闲中断需要手动清零。

1.空闲中断的认识,空闲中断的允许要手动解除中断屏蔽

2.空闲中断必须手动清零,不然中断会一直置位,系统会不断进中断处理函数

3.所有的跟串口一相关的中断都会进串口一中断处理函数

 当传输一个字符串时,利用空闲中断,那控制数据的完整传输,实现思路:开启空闲中断和接收中断,接收一个字符,触发接收中断,跳转中断函数,完成接收单个字符,继续读取下一位,当读取到最后一位数据,结束传输并进入空闲中断

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
//使用串口接收中断+空闲中断
	if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE))// 1. 获得串口空闲中断标志	
	{	
        __HAL_UART_CLEAR_FLAG(&huart1,UART_CLEAR_IDLEF); // 2. 清除空闲中断标志
		//3.这里写中断执行
		HAL_UART_Transmit(&huart1,buf_recv,sizeof(buf_recv),1000);
		len=0;
		memset(buf_recv,0,sizeof(buf_recv));
	}else
	{			
		buf_recv[len]=USART1->RDR; 
		len++;
		HAL_UART_Receive_IT(&huart1,buff,1);
	}

  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */


  /* USER CODE END USART1_IRQn 1 */
}

 

三.空闲中断+DMA

		HAL_UART_Receive_DMA(&huart1,buf_ctl,64);	//接收DMA使能
		__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);	//开启串口空闲中断

开启中断,实现不定长接收

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
	if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE))	
	{                               // 1. 获得串口空闲中断标志	
		__HAL_UART_CLEAR_FLAG(&huart1,UART_CLEAR_IDLEF);													 // 2. 清除空闲中断标志
		HAL_UART_DMAStop(&huart1);	 // 3. 清除->空闲->停止DMA		
		len = 64 - hdma_usart1_rx.Instance->CNDTR;
            // 4. 设定的传输长度-剩余传输数量(DMA_CNDTRx)=实际长度
		buf_ctl[len]='\0';
		HAL_UART_Transmit(&huart1,buf_ctl,sizeof(buf_ctl),500);
		memset(buf_ctl,0,sizeof(buf_ctl));
		HAL_UART_Receive_DMA(&huart1, buf_ctl, 64);
								     // 6. 重新开启DMA
	}
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */

  /* USER CODE END USART1_IRQn 1 */
}

 

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值