HAL库空闲中断函数太好用啦——多串口使用空闲中断函数

目录

空闲中断的理解:

空闲函数的优点:

代码示例:

多串口开启空闲中断接收:


该博客文章初衷是记录本人在嵌入式路上学习和实践的足迹,意在巩固与记录。记录的同时也希望能对你有所帮助。

HAL库更新之后增加了空闲中断函数,在学习HAL库的过程中发现其优点明显,且网上并没有找到相关的讲解和实例,故作此分享。

空闲中断的理解:

        在串口通信中,发送的两个字符之间间隔非常短,所以在两个字符之间不叫空闲。空闲的定义是总线上在一个字节的时间内没有再接收到数据,空闲中断是检测到有数据被接收后,总线上在一个字节的时间内没有再接收到数据的时候发生的。
        当总线一个数据帧发送完成,一个字节时间内没有接收到数据后,系统开启空闲中断。所以串口的空闲中断也叫帧中断

空闲函数的优点:

        如果没有帧中断,必须在接收中断中判断每一个接收数据与帧头帧尾是否相符,效率极低。使用空闲中断后,只需识别缓冲区的帧头即可。注意,这里不是在接收时判断,而是接收完成后判断。

代码示例:

重定义回调函数:

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)//空闲中断回调函数
{	

	//执行自己编写的代码

	HAL_UARTEx_ReceiveToIdle_IT(&huart1,rxbuff,10);								
	//重新开启空闲中断接收			
	
}

main函数里面要先开启一次空闲中断接收:

int main(void)
{
   HAL_UARTEx_ReceiveToIdle_IT(&huart1,rxbuff,5); 

    while(1)
    {
        
    }
}

rxbuff是自己定义的接收缓冲区;

多串口开启空闲中断接收:

在做项目时还遇到一点,stm32内部串口的接收缓冲区是共用的,所以想要多串口开启空闲中断接收就需要串口轮流使用接收缓冲区,也就是轮流开启空闲中断接收

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)//空闲中断回调函数
{	
	if(huart->Instance==USART1)
	{
		if(rxbuff[0] == 0x14)//判断帧头
		{
			//处理函数
			HAL_UARTEx_ReceiveToIdle_IT(&huart3,rxbuff,10);						
		}
		else
		{
            //数据有误,重新接收 
			HAL_UARTEx_ReceiveToIdle_IT(&huart1,rxbuff,5);
		}
				
	}
	else if(huart->Instance==USART3)
	{
		if(rxbuff[0] == 0xFF)//判断帧头
		{
			//处理函数			
			HAL_UARTEx_ReceiveToIdle_IT(&huart1,rxbuff,5);			
		}
		else
		{   //数据有误,重新接收 
			HAL_UARTEx_ReceiveToIdle_IT(&huart3,rxbuff,10);
		}
				
	}
	
}

接收缓冲区在重新开启空闲中断时就已经清除;

若有不当欢迎指正或补充。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值