咨询一个接收消息的处理的问题?
以下是我的消息接收函数 一个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;
}
}
}
}
[最优解释]
1. 协议设计问题 你肯定发现了 帧头帧尾标识 不一样 会好处理些
2. 工作方式问题,数据是连续来,还是有一定间隔呢
如果是连续的 一但丢失帧尾,要重新定位一有效帧 必须 找到 帧头为 7E 7E 的 数据
显然得丢一个赔一个
如果不是连续来的,可以用CTI 字符间超时,两个字符间接收间隔超过一定时长 就认为该帧结束。
[其他解释]
要学会丢弃和超时复位
[其他解释]
这个我可以在URAT中断里面加一个定时器吗??当定时满了我就复位
那如果我是连续收帧 假如他把第二帧的帧头当了帧尾处理 是不是这个第二帧我就也要舍弃掉 然后通过判断第二帧尾跟第三帧头中间没有字节来确定把程序认为是第二帧帧尾的第三帧帧头该正为帧头,可能表达的不清楚