处理串口接收不定长数据的另一种解决方法

9 篇文章 1 订阅

开发平台:Keil 5
库函数版本:V3.5
芯片:STM32F103CBT6

之前我在我的另一篇博客中介绍过使用串口空闲中断+DMA的方式来处理不定长数据,没有看过的同学可以点击这里查看。今天要介绍另一种接收不定长数据的方法。

使用的是接收中断和和空闲中断结合的方式。大概思路是:我们在串口配置的时候先只开串口接收完成中断,然后在接收中断中再开启空闲中断,当空闲中断发生时,表明本次数据接收完成,再次关闭空闲中断,然后把数据送到处理函数中处理。

这种方式的好处是,在接收完成中断中,我们只需要把数据放在缓冲区中即可,不需要再对数据做判断来确定本次数据是否接收完成,这块可以节约MCU资源,实现起来也比较简单。具体的串口配置我就不做详细介绍,和普通的串口配置没什么不同,主要是要在接收中断中打开空闲中断,然后在空闲中断中关闭空闲中断以接收下一帧数据,最后再做一个数据处理。

我们直接放中断处理函数来分析一下:

//陀螺仪通讯串口
#define GYRO_UART USART2

//串口2中断服务程序
void USART2_IRQHandler(void)                	
{    
    static uint16_t uart_recv_count = 0 ; //接收计数
    unsigned int data;	//接收缓冲
    if(GYRO_UART->SR & 0x0F)
    {
        data = GYRO_UART->DR;
    }		
    else if(GYRO_UART->SR & USART_FLAG_RXNE)  
    {		
        data = GYRO_UART->DR;
	    sensor_data_buffer[uart_recv_count++] =data;//(USART1->DR);	//读取接收到的数据
	     if(uart_recv_count==1)
         {
               USART_ITConfig(GYRO_UART, USART_IT_IDLE, ENABLE); //使能空闲中断
         }
			                    
    }	
	else if(GYRO_UART->SR & USART_FLAG_IDLE){
        data=GYRO_UART->SR;
        data=GYRO_UART->DR;               //清串口故障
        USART_ITConfig(GYRO_UART, USART_IT_IDLE, DISABLE);   //关空闲中断 等待下次接收
        gyro_data_process(sensor_data_buffer, uart_recv_count);   //数据处理
        memset(sensor_data_buffer, 0, uart_recv_count);   //清掉数据 方便下次接收
        uart_recv_count = 0;        	//计数清零 方便下次接收
    }
    
} 

如上代码段所示。这样可以实现接收不定长数据并处理,这样做的好处就是不用每次都判断是否收到帧头或者帧尾,而是集中起来一次处理之。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值