找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5721|回复: 4
打印 上一主题 下一主题
收起左侧

单片机串口通信 为什么发送数据时需要while(!TI)语句

[复制链接]
跳转到指定楼层
楼主
ID:249916 发表于 2017-11-16 00:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
代码data=SBUF;
TR=0;
SBUF=data;
while(!TI);
TI=0;


为什么发送数据时,需要while(!TI)语句,而接收数据时不需要while(!TR)语句
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:164602 发表于 2017-11-16 09:25 | 只看该作者
对于串口发送,单片机是占据主动地位的,可以预计什么时间发送完毕,所以程序利用TI发送完毕标志位等待,是一个主动行为。
而对于单片机的接收,就完全是被动的了,不知道什么时候串口会来数据,所以程序是不可能一直等待接收的(当然,这也不是绝对的,所有的串口通讯例子程序,只有一个发送接收的任务,就可以一直等待接收,用扫描法等待,但这样做单片机的工作效率是非常低的),这件事儿交给CPU了,只要接收完成,RI就会置1,就会产生中断(如果中断是被允许的话),这比让程序等待效果好多了。
所以,只有发送的等待,没有接收的等待!
回复

使用道具 举报

板凳
ID:249916 发表于 2017-11-16 10:23 | 只看该作者
HC6800-ES-V2.0 发表于 2017-11-16 09:25
对于串口发送,单片机是占据主动地位的,可以预计什么时间发送完毕,所以程序利用TI发送完毕标志位等待,是 ...

懂了,
执行到SBUF=data;语句,芯片就在后台进行数据发送
而while(!Ti)在等待数据发送完毕。
谢谢大神。
回复

使用道具 举报

地板
ID:123289 发表于 2017-11-16 19:25 | 只看该作者
串行发送一个字节时是需要时间的!
如果只发一个字节,根本就不需要等【不需要做while(!Ti)】。
如果需要发多个字节,问题来了,发完一个后,如果立即发下一个,则前一个数据会被下一个冲掉!所以必须要等前一个发完才能发下一个。
串口的硬件,在发完数据后,会做一个TI=1的标记,所以检测TI是否为1就能知道数据是否完成了串行发送。
当然也有不做【while(!Ti)】的方法,就是每固定间隔一个时间t,发送一个字节,只要t的取值>串行发送一个字节的时间即可。
回复

使用道具 举报

5#
ID:136238 发表于 2017-11-16 20:34 | 只看该作者
等待发送完成
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表