51单片机串口接收多字符并存入数组的程序
voidSend()interrupt4{bitflag1=0,flag2;ucharreceive,lenth,i;if(RI==1){RI=0;receive=SBU...
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;
}
}
}
这是中断程序,请指教 展开
{
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;
}
}
}
这是中断程序,请指教 展开
4个回答
展开全部
你这串口接收子程序,只要接收到第一个字节的数据就一直在中断子程序中,然后等待接收其它数据了,
while(!RI); 这就是在等待接收其它数据了,接收完了以后又在中断子程序连续发送了。这么写程序是有很大弊病的,一旦进入中断程序,到最后发送结束,都一直在中断子程序中,那这个期间单片机是不能再做其它工作的,也就是不能再执行主程序了。
while(!RI);这就是查询方式等待接收数据,那又何必写成中断程序呢,不如直接写成查询程序了,同样下面的, while(!TI);这也明明是在查询方式发送,就不必要写在中断程序中了。
既然采用中断的方式,就是当接收到一个数据后才响应一次中断,保存这个数据,然后就立即从中断返回,这样,继续执行主程序,这样,接收数据和发送数据才不影响主程序。
同理,在中断程序发送一个字节的数据就立即从中断返回执行主程序,也不影响主程序的执行。
另外,更重要的一点就是while(!RI);,等待接收数据,如果不能收到数据就永远等待下去,假如通信线有故障,或者发送方有问题,不能发送数据了,那么将永远等待下去,这就相当于死机了,多可怕,写程序就怕这个事情发生的。
while(!RI); 这就是在等待接收其它数据了,接收完了以后又在中断子程序连续发送了。这么写程序是有很大弊病的,一旦进入中断程序,到最后发送结束,都一直在中断子程序中,那这个期间单片机是不能再做其它工作的,也就是不能再执行主程序了。
while(!RI);这就是查询方式等待接收数据,那又何必写成中断程序呢,不如直接写成查询程序了,同样下面的, while(!TI);这也明明是在查询方式发送,就不必要写在中断程序中了。
既然采用中断的方式,就是当接收到一个数据后才响应一次中断,保存这个数据,然后就立即从中断返回,这样,继续执行主程序,这样,接收数据和发送数据才不影响主程序。
同理,在中断程序发送一个字节的数据就立即从中断返回执行主程序,也不影响主程序的执行。
另外,更重要的一点就是while(!RI);,等待接收数据,如果不能收到数据就永远等待下去,假如通信线有故障,或者发送方有问题,不能发送数据了,那么将永远等待下去,这就相当于死机了,多可怕,写程序就怕这个事情发生的。
展开全部
一定要用的话加个定时,超时报错,然后执行主程序。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
每接收到一个数据就判断数据的合法性,功能,再存到数组里,没收一个还要判断是不是一帧数据什么的、、、、、
更多追问追答
追问
您说这程序怎么改吧
追答
你要完成什么功能都不知道,我也不知道怎么改。
起码像下面那位lycdl说的,你这么写不等着死机嘛!
这类的代码在百度里很多的,先参考参考别人的。。。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
有qq吗?发过来,我为你解答
追问
1286020837
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询