找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 6520|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)串口通信 為什么發(fā)送數(shù)據(jù)時(shí)需要while(!TI)語(yǔ)句

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:249916 發(fā)表于 2017-11-16 00:29 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
代碼data=SBUF;
TR=0;
SBUF=data;
while(!TI);
TI=0;


為什么發(fā)送數(shù)據(jù)時(shí),需要while(!TI)語(yǔ)句,而接收數(shù)據(jù)時(shí)不需要while(!TR)語(yǔ)句
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:164602 發(fā)表于 2017-11-16 09:25 | 只看該作者
對(duì)于串口發(fā)送,單片機(jī)是占據(jù)主動(dòng)地位的,可以預(yù)計(jì)什么時(shí)間發(fā)送完畢,所以程序利用TI發(fā)送完畢標(biāo)志位等待,是一個(gè)主動(dòng)行為。
而對(duì)于單片機(jī)的接收,就完全是被動(dòng)的了,不知道什么時(shí)候串口會(huì)來(lái)數(shù)據(jù),所以程序是不可能一直等待接收的(當(dāng)然,這也不是絕對(duì)的,所有的串口通訊例子程序,只有一個(gè)發(fā)送接收的任務(wù),就可以一直等待接收,用掃描法等待,但這樣做單片機(jī)的工作效率是非常低的),這件事兒交給CPU了,只要接收完成,RI就會(huì)置1,就會(huì)產(chǎn)生中斷(如果中斷是被允許的話),這比讓程序等待效果好多了。
所以,只有發(fā)送的等待,沒有接收的等待!
回復(fù)

使用道具 舉報(bào)

板凳
ID:249916 發(fā)表于 2017-11-16 10:23 | 只看該作者
HC6800-ES-V2.0 發(fā)表于 2017-11-16 09:25
對(duì)于串口發(fā)送,單片機(jī)是占據(jù)主動(dòng)地位的,可以預(yù)計(jì)什么時(shí)間發(fā)送完畢,所以程序利用TI發(fā)送完畢標(biāo)志位等待,是 ...

懂了,
執(zhí)行到SBUF=data;語(yǔ)句,芯片就在后臺(tái)進(jìn)行數(shù)據(jù)發(fā)送
而while(!Ti)在等待數(shù)據(jù)發(fā)送完畢。
謝謝大神。
回復(fù)

使用道具 舉報(bào)

地板
ID:123289 發(fā)表于 2017-11-16 19:25 | 只看該作者
串行發(fā)送一個(gè)字節(jié)時(shí)是需要時(shí)間的!
如果只發(fā)一個(gè)字節(jié),根本就不需要等【不需要做while(!Ti)】。
如果需要發(fā)多個(gè)字節(jié),問題來(lái)了,發(fā)完一個(gè)后,如果立即發(fā)下一個(gè),則前一個(gè)數(shù)據(jù)會(huì)被下一個(gè)沖掉!所以必須要等前一個(gè)發(fā)完才能發(fā)下一個(gè)。
串口的硬件,在發(fā)完數(shù)據(jù)后,會(huì)做一個(gè)TI=1的標(biāo)記,所以檢測(cè)TI是否為1就能知道數(shù)據(jù)是否完成了串行發(fā)送。
當(dāng)然也有不做【while(!Ti)】的方法,就是每固定間隔一個(gè)時(shí)間t,發(fā)送一個(gè)字節(jié),只要t的取值>串行發(fā)送一個(gè)字節(jié)的時(shí)間即可。
回復(fù)

使用道具 舉報(bào)

5#
ID:136238 發(fā)表于 2017-11-16 20:34 | 只看該作者
等待發(fā)送完成
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表