找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6598|回復(fù): 4
收起左側(cè)

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

[復(fù)制鏈接]
ID:249916 發(fā)表于 2017-11-16 00:29 | 顯示全部樓層 |閱讀模式
代碼data=SBUF;
TR=0;
SBUF=data;
while(!TI);
TI=0;


為什么發(fā)送數(shù)據(jù)時(shí),需要while(!TI)語句,而接收數(shù)據(jù)時(shí)不需要while(!TR)語句
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

懂了,
執(zhí)行到SBUF=data;語句,芯片就在后臺進(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é),問題來了,發(fā)完一個(gè)后,如果立即發(fā)下一個(gè),則前一個(gè)數(shù)據(jù)會被下一個(gè)沖掉!所以必須要等前一個(gè)發(fā)完才能發(fā)下一個(gè)。
串口的硬件,在發(fā)完數(shù)據(jù)后,會做一個(gè)TI=1的標(biāo)記,所以檢測TI是否為1就能知道數(shù)據(jù)是否完成了串行發(fā)送。
當(dāng)然也有不做【while(!Ti)】的方法,就是每固定間隔一個(gè)時(shí)間t,發(fā)送一個(gè)字節(jié),只要t的取值>串行發(fā)送一個(gè)字節(jié)的時(shí)間即可。
回復(fù)

使用道具 舉報(bào)

ID:136238 發(fā)表于 2017-11-16 20:34 | 顯示全部樓層
等待發(fā)送完成
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

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