我需要一个程序,51单片机串口接受到一帧数据并把这一帧数据赋值到一个数组中。 30

谢谢了,真的没有财富值值了... 谢谢了,真的没有财富值值了 展开
 我来答
橙门听X
2019-05-12 · TA获得超过2571个赞
知道大有可为答主
回答量:4669
采纳率:88%
帮助的人:698万
展开全部
你这串口接收子程序,只要接收到第一个字节的数据就一直在中断子程序中,然后等待接收其它数据了,
while(!RI); 这就是在等待接收其它数据了,接收完了以后又在中断子程序连续发送了。这么写程序是有很大弊病的,一旦进入中断程序,到最后发送结束,都一直在中断子程序中,那这个期间单片机是不能再做其它工作的,也就是不能再执行主程序了。
while(!RI);这就是查询方式等待接收数据,那又何必写成中断程序呢,不如直接写成查询程序了,同样下面的, while(!TI);这也明明是在查询方式发送,就不必要写在中断程序中了。
既然采用中断的方式,就是当接收到一个数据后才响应一次中断,保存这个数据,然后就立即从中断返回,这样,继续执行主程序,这样,接收数据和发送数据才不影响主程序。
同理,在中断程序发送一个字节的数据就立即从中断返回执行主程序,也不影响主程序的执行。
另外,更重要的一点就是while(!RI);,等待接收数据,如果不能收到数据就永远等待下去,假如通信线有故障,或者发送方有问题,不能发送数据了,那么将永远等待下去,这就相当于死机了,多可怕,写程序就怕这个事情发生的。
李天花板
2019-05-14
知道答主
回答量:28
采纳率:100%
帮助的人:1.7万
展开全部
这不就是串口接收吗,你看下STC有资料的,可以用中断也可以用查询方法来接收,这么说还不会的话,哦。。。多看下资料了,只能这么说。这么的,贴一点我自己的代码你参考看下吧:
void sCom1Main() interrupt 4{
if(RI){
RI = 0;
if(biComE232RxFlg==0 ){// 解析后再读第2次
if(ucE232RxCnt < 8){//8个数据 解析一次
ucE232RxBuf[ucE232RxCnt] = SBUF;//存放数组
ucE232RxCnt++;
if(ucE232RxCnt ==8){//8个数据 解析一次
biComE232RxFlg = 1;//设置解析标志
}
}
}
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式