STM32F4串口接收(HAL库)使用笔记

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

这个是一个类似于串口接收中断使能作用的函数,注释是Receives an amount of data in non blocking mode以非阻塞方式接收大量数据。想要使用此函数接收却不确定能接收到多少数据,则将uint16_t Size写作1,例如: 

HAL_UART_Receive_IT(&UartHandle1, (uint8_t *)Rx1Buffer, 1);//通过串口1接收,数据保存到Rx1Buffer,每次接收1个字符。

 HAL_UART_RxCpltCallback这个函数看资料是说在接收完成后调用的,所以说每接收一个字符都会调用这个函数,这个函数这么写:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)  //
{  	
	switch ((uint32_t)(huart->Instance))
	{
		case (uint32_t)USART1:	
                {
			
			if(Rx1count==0)
			{
				Rx1Buffer[0]=Rx1Buffer[lastnum];
				lastnum= 0;
			}
			Rx1count++;
			HAL_UART_Receive_IT(huart, (uint8_t *)(Rx1Buffer + Rx1count), 1);    //重新使能中断  

			__HAL_TIM_SET_COUNTER(&Tim5Handle,0); // 清零定时器计数  
			__HAL_TIM_CLEAR_FLAG(&Tim5Handle, TIM_FLAG_UPDATE|TIM_FLAG_CC2);//清除中断标志
			HAL_TIM_Base_Start_IT(&Tim5Handle);
	         
		    break;	

                 }

其余case略 。

定时器5根据串口波特率来延时一段时间,若延时期间又接收到一个字符,将会再次进入HAL_UART_RxCpltCallback,所以大概估计一下一次可能接收到的数据长度,结合波特率计算一下这个时间即可。

延时完之后:

            HAL_UART_Receive_IT(&UartHandle1, (uint8_t *)Rx1Buffer, 1);        //使能接收中断
            Rx1revflag = 1;    
            HAL_TIM_Base_Stop_IT(htim);    

串口线程:
        if(Rx1revflag)
        {
            Rx1revflag = 0;
                    
            Trans_dispose((char*)Rx1Buffer,Rx1count);        

            lastnum = Rx1count;
            memset(Rx1Buffer, 0, Rx1count);
            Rx1count = 0;            
        }        

以下是傻瓜式解读:

故而假如第一次收了一段数据为“12345”,收完时Rx1count=5,重新使能中断HAL_UART_Receive_IT(huart, (uint8_t *)(Rx1Buffer + Rx1count), 1); 则下一次接收的字符将存入Rx1Buffer[5],经过串口线程处理之后lastnum = Rx1count=5,清空Rx1Buffer前5个字符,又再次进入HAL_UART_RxCpltCallback这个函数,由于Rx1count=0,则将Rx1Buffer[lastnum]赋值给Rx1Buffer[0],开始下一轮接收。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值