咨询一个接收消息的处理的有关问题

咨询一个接收消息的处理的问题?
以下是我的消息接收函数 一个URAT中断函数,消息定义是 7E 00 00 00 00 7E
我这个函数在不出现错误消息的时候没有问题 能正常使用 ,但是 如果丢失帧尾那个7E  就会出问题 ,这个怎么处理呢要 
还有就是 如果我只接受一帧然后丢失了帧尾7E,会一直等待,
另一种情况是连续接到2帧或者几帧 其中一帧帧尾7E丢失 是不是我这几帧全部会出问题 怎么解决这些问题呢 ?
加定时器?我是新手 不是很懂 求大神解答
#include <c8051f330.h>
#include <stdio.h> 
#include <485.h>

//-----------------------------------------

uchar frag_len=0;
uchar tp=0;
uchar len_s=0;
bit frag=0;
uchar UART0_Buffer[4]={0,0,0,0};
uchar data_buf[4]={0,0,0,0}; 
void UART0_Interrupt (void) interrupt 4
{   
    
uchar tmp=0;
uchar i=0;

    
  if(RI0==1)
    
  {
RI0 = 0;
tmp = SBUF0;
  
if(tp==1)    // 接收到的上一个字节为0xdb
{
switch(tmp)
{
case 0x02:
     data_buf[frag_len] = 0x7d;    // 0x7d02表示0x7d
     frag_len++;
 tp=0;
     break;
case 0x01:
     data_buf[frag_len] = 0x7e;    // 0x7d01表示0x7e
     frag_len++;
 tp=0;
     break;
default: break;
     }


}
  else 
   {
     switch(tmp)    // 正常情况
   {
  case 0x7e:    // 帧头
                    if (frag==0)
      {
       frag=1;
   frag_len=0;
        }
   else
                       for(i=0;i<4;i++){UART0_Buffer[i]=0;}
                 
                       for(i=0;i<frag_len;i++){UART0_Buffer[i]=data_buf[i];}
            
                   for(i=0;i<4;i++){data_buf[i]=0;}
                        len_s=frag_len;
                frag_len=0;
                        frag=0;
//sym=1;
             
                 break;
case 0x7d:    // 检测到转义字符
 tp=1;
 break;
default:    // 普通数据
     if(frag==1)
    {