超时的2种方法

在双机通讯或者判断晶振是否成功起振都会用到超时。

一 串口通讯超时和断帧判断:

断帧:   1如果接收帧的长度都是固定的则可以按照长度来判断一帧的接收;

      2如果各帧数据长度不等但帧中包含了帧的长度信息也可以按通讯协议中不同帧的长度判断;

                     3 利用接收空闲中断作为断帧条件,通讯没有结束就利用正常接收中断,如果通讯结束则进入空闲中断。但这不适合中途改变通讯波特率或者通讯波特率不匹配就会进入空闲中断造成错误。优点:串口的内在机制。

                     5结合定时器进行超时判断:专门用一个定时器作为超时用,ms级的周期中断,同时该定时器有一个超时使能标志flag_entimeout.在每个串口的每次通讯中只有接收到第一字节时才使能超时判断标志,后面每接收一字节都清零定时计数器的count;而在定时器中断函数中根据是否使能超时判断标志,各自的超时时间(根据波特率估算几个字符发送需要的时间)和计数器进行对比,从而判断本串口各帧的接收完成。定时器的优先级设置的比串口低,这样通讯结束后才进行定时计算;优点是一个定时器可以管理几个串口的超时。

 估算超时:比如9600 ,8,N,1,格式, 一个位的时间 是 104US,(1000000/9600); 一个字节要用10个位, 104*10=1040,约一毫秒时间,然后根据收发帧的字节数+内部处理的时间+2个bit位时间。

5.1或者定时器不设置成周期中断且非自动重装,在每次通讯接收第一字节时使能定时器,设置超时中断时间(几个字符),每接收一字节就清零计数器,当不在接收时,因为计数器溢出产生中断说明超时时间到或者已经断帧接收到数据,然后关闭定时器。缺点是不能做到多串口的并发超时判断,因为不同优先级的串口嵌套发生时,不确定是谁中断的还会打乱另一个的超时计划。

 

typedef timeout

{

  bool flag_timeout;

      unsigned long  timecnt;

       unsigned long timevar

}Timeout_TypeDef;

二 阻塞式的超时判断:

/*功能:判断超时
  参数:超时时间
  特点:阻塞式,需要结合外部中断触发改变flag_XX
*/
bool Judge_chaoshi( var_t)
{
    bit flag_chaoshi=0;
    unsigned int i=var_t /*需要估计或实验值大小,要比正常所需稍长一点时间*/
    do{
        if(flag_XX)/*外部中断触发*/
            break;
    }while(i--);
    if(i==0)
        flag_chaoshi=1;
    return flag_chaoshi;

}
三 重试检查:

i=trytimes;
do{
     flag=CheckFun();
     --i;
}while((!flag)&&i);

whilie(!CheckFun() && i)
{
    i--;
}

/**
    缺点:每个超时任务都要维护一个lasttick 和curtick.   

**/
static u32 lasttick;
u32 curtick;

while(1)
{
    curtick=GetTick();
    if((curtick -lasttick) !=timeout)
    {
        lasttick=curtick;
    }else{
        do somthing;
   }
}

 

posted on 2017-07-18 18:32  杰瑞鼠  阅读(682)  评论(0编辑  收藏  举报