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;
}
}
}
这是中断程序,请指教
展开
 我来答
lycdl
高粉答主

2014-10-21 · 醉心答题,欢迎关注
知道大有可为答主
回答量:2万
采纳率:94%
帮助的人:4937万
展开全部
你这串口接收子程序,只要接收到第一个字节的数据就一直在中断子程序中,然后等待接收其它数据了,
while(!RI); 这就是在等待接收其它数据了,接收完了以后又在中断子程序连续发送了。这么写程序是有很大弊病的,一旦进入中断程序,到最后发送结束,都一直在中断子程序中,那这个期间单片机是不能再做其它工作的,也就是不能再执行主程序了。
while(!RI);这就是查询方式等待接收数据,那又何必写成中断程序呢,不如直接写成查询程序了,同样下面的, while(!TI);这也明明是在查询方式发送,就不必要写在中断程序中了。
既然采用中断的方式,就是当接收到一个数据后才响应一次中断,保存这个数据,然后就立即从中断返回,这样,继续执行主程序,这样,接收数据和发送数据才不影响主程序。
同理,在中断程序发送一个字节的数据就立即从中断返回执行主程序,也不影响主程序的执行。
另外,更重要的一点就是while(!RI);,等待接收数据,如果不能收到数据就永远等待下去,假如通信线有故障,或者发送方有问题,不能发送数据了,那么将永远等待下去,这就相当于死机了,多可怕,写程序就怕这个事情发生的。
家电师傅
2020-09-09
知道答主
回答量:4
采纳率:0%
帮助的人:1679
展开全部
一定要用的话加个定时,超时报错,然后执行主程序。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jmhyys
2014-10-21 · TA获得超过524个赞
知道小有建树答主
回答量:1052
采纳率:62%
帮助的人:287万
展开全部
每接收到一个数据就判断数据的合法性,功能,再存到数组里,没收一个还要判断是不是一帧数据什么的、、、、、
更多追问追答
追问
您说这程序怎么改吧
追答
你要完成什么功能都不知道,我也不知道怎么改。
起码像下面那位lycdl说的,你这么写不等着死机嘛!
这类的代码在百度里很多的,先参考参考别人的。。。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
单片机的战斗机
2014-10-21 · 超过31用户采纳过TA的回答
知道答主
回答量:445
采纳率:0%
帮助的人:93.1万
展开全部
有qq吗?发过来,我为你解答
追问
1286020837
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式