51单片机串口接收多字符并存入数组的程序

void Send() interrupt 4
{
bit flag1=0,flag2;
uchar receive,lenth,i;
if(RI==1)
{
RI=0;
receive=SBUF;
if(receive==0x02&&lenth==0)
{
buf[0]=receive;
flag2=1;
}
if(flag2==1)
{
while(!RI);
RI=0;
lenth++;
buf[lenth]=receive;
}
while(receive!=0X03);
if(lenth==6&&buf[4]==0x97)
{
lenth=0;
flag1=1;
flag2=0;
}
if(flag1==1)
{
wen();
SBUF=0X02;
while(!TI);
TI=0;
for(i=0;i<11;i++)
{
SBUF=tab[i];
while(!TI);
TI=0;
}
SBUF=0X03;
while(!TI);
TI=0;
}
}
}
这是中断程序,请指教

你这串口接收子程序,只要接收到第一个字节的数据就一直在中断子程序中,然后等待接收其它数据了,
while(!RI); 这就是在等待接收其它数据了,接收完了以后又在中断子程序连续发送了。这么写程序是有很大弊病的,一旦进入中断程序,到最后发送结束,都一直在中断子程序中,那这个期间单片机是不能再做其它工作的,也就是不能再执行主程序了。
while(!RI);这就是查询方式等待接收数据,那又何必写成中断程序呢,不如直接写成查询程序了,同样下面的, while(!TI);这也明明是在查询方式发送,就不必要写在中断程序中了。
既然采用中断的方式,就是当接收到一个数据后才响应一次中断,保存这个数据,然后就立即从中断返回,这样,继续执行主程序,这样,接收数据和发送数据才不影响主程序。
同理,在中断程序发送一个字节的数据就立即从中断返回执行主程序,也不影响主程序的执行。
另外,更重要的一点就是while(!RI);,等待接收数据,如果不能收到数据就永远等待下去,假如通信线有故障,或者发送方有问题,不能发送数据了,那么将永远等待下去,这就相当于死机了,多可怕,写程序就怕这个事情发生的。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-09-09
一定要用的话加个定时,超时报错,然后执行主程序。
第2个回答  2014-10-21
每接收到一个数据就判断数据的合法性,功能,再存到数组里,没收一个还要判断是不是一帧数据什么的、、、、、追问

您说这程序怎么改吧

追答

你要完成什么功能都不知道,我也不知道怎么改。
起码像下面那位lycdl说的,你这么写不等着死机嘛!
这类的代码在百度里很多的,先参考参考别人的。。。。。

追问

我是要接收一串特定的字符,然后放入数组,之后再比较,我也看过很多,可是感觉很杂,也试了,但是不行

追答

改好了,字数太多,发不上去。。私信吧!!
if(RI==1)
{
RI=0;

receive=SBUF;
switch(job_flag)
{
case 0:
if(receive=='$')//判断起始符号
{
job_flag=1;

}
break;
case 1: //判断接收数据长度
lenth=receive;
job_flag=2;
break;

改好了,字数太多,发不上去。。私信吧!!

第3个回答  2014-10-21
有qq吗?发过来,我为你解答追问

1286020837

相似回答