串口接收超时中断程序思路

时间:2024-05-18 17:46:43

方法0:

//通过判断接收连续2个字符之间的时间差不大于10ms来决定是不是一次连续的数据.
//如果2个字符接收间隔超过10ms,则认为不是1次连续数据.也就是超过10ms没有接收到
//任何数据,则表示此次接收完毕.
//接收到的数据状态
//[15]:0,没有接收到数据;1,接收到了一批数据.
//[14:0]:接收到的数据长度
u16 USART2_RX_STA=0;        
void USART2_IRQHandler(void)
{
    u8 res;        
    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据
    {     
 
        res =USART_ReceiveData(USART2);        
        if(USART2_RX_STA<USART2_MAX_RECV_LEN)        //还可以接收数据
        {
            TIM_SetCounter(TIM4,0);//计数器清空                         
            if(USART2_RX_STA==0)

                     TIM4_Set(1);         //使能定时器4的中断 
            USART2_RX_BUF[USART2_RX_STA++]=res;        //记录接收到的值     
        }

       else 
        {
            USART2_RX_STA|=1<<15;                    //强制标记接收完成
        } 
    }                                               
}   

//定时器4中断服务程序            
void TIM4_IRQHandler(void)
{     
    if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)//是更新中断
    {                    
        USART2_RX_STA|=1<<15;    //标记接收完成
        TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );  //清除TIMx更新中断标志    
        TIM4_Set(0);            //关闭TIM4  
    }        
}
//设置TIM4的开关
//sta:0,关闭;1,开启;
void TIM4_Set(u8 sta)
{
    if(sta)
    {
       
        TIM_SetCounter(TIM4,0);//计数器清空
        TIM_Cmd(TIM4, ENABLE);  //使能TIMx    
    }else TIM_Cmd(TIM4, DISABLE);//关闭定时器4       
}

方法1:在接收中断中设置定时中断计数初值,开启定时中断

串口接收超时中断程序思路