以下是我的消息接收函数 一个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)
{
data_buf[frag_len]=tmp; // 保存数据
frag_len++;
break;
}
else
break;
}
}
}
} |