標(biāo)題: 有關(guān)RS232串行通信的問(wèn)題,請(qǐng)教大家 [打印本頁(yè)]

作者: newlined    時(shí)間: 2024-9-5 16:58
標(biāo)題: 有關(guān)RS232串行通信的問(wèn)題,請(qǐng)教大家
現(xiàn)在51單片機(jī)普遍集成了232串口,我的理解是既然集成了串口,收發(fā)都應(yīng)該是不用占用CPU的時(shí)間的(中斷處理除外),在一些例程中,我發(fā)現(xiàn)單片機(jī)接收數(shù)據(jù)是這樣的,程序中初始化串口后,打開(kāi)串口中斷,當(dāng)串口接收數(shù)據(jù)完成后,會(huì)觸發(fā)串口中斷,在中斷程序中,只要 RI=0;DAT=SBUF;取走數(shù)據(jù)即可。在發(fā)送數(shù)據(jù)時(shí),我原以為只要在主程序中 執(zhí)行 SBUF=DAT;在串口中斷程序中有語(yǔ)句TI=0;就行。但實(shí)際中不行,數(shù)據(jù)發(fā)不出去,要這樣編寫(xiě)程序,
SBUF=DAT;while(!TI); TI=0; 程序是這樣執(zhí)行的,數(shù)據(jù)送到SBUF;觸發(fā)串口發(fā)送機(jī)制,CPU等待發(fā)送完成,然后清TI。為什么是這樣,數(shù)據(jù)送到SBUF,讓串口自己發(fā)送,發(fā)送完成后,通過(guò)中斷通知CPU不行嗎?以前那些沒(méi)有集成232串口,用外部232芯片的單片機(jī),在發(fā)送數(shù)據(jù)時(shí),也要等待數(shù)據(jù)發(fā)送完成嗎?謝謝。


作者: xuyaqi    時(shí)間: 2024-9-6 06:42
CPU把8位要發(fā)送數(shù)據(jù)傳給串口硬件發(fā)送是需要時(shí)間的,while(!TI); 就是等發(fā)完。
作者: runmuel    時(shí)間: 2024-9-6 08:41
建議看一看51單片機(jī)的結(jié)構(gòu)原理你就會(huì)明白了,串口中斷沒(méi)有硬件清除中斷標(biāo)志功能,至于232芯片只是增強(qiáng)傳輸距離作用而已。
作者: newlined    時(shí)間: 2024-9-6 09:04
xuyaqi 發(fā)表于 2024-9-6 06:42
CPU把8位要發(fā)送數(shù)據(jù)傳給串口硬件發(fā)送是需要時(shí)間的,while(!TI); 就是等發(fā)完。

謝謝您的回復(fù),CPU把8位要發(fā)送數(shù)據(jù)傳給串口硬件發(fā)送是需要時(shí)間,這個(gè)時(shí)間不是就是執(zhí)行 SBUF=DAT;的時(shí)間嗎?您的意思是數(shù)據(jù)送到SBUF后就TI自動(dòng)置1了?請(qǐng)看下面的時(shí)序圖,看起來(lái)執(zhí)行SBUF=DAT后TI不置1,發(fā)送完成后才置1。

無(wú)標(biāo)題.png (19.21 KB, 下載次數(shù): 6)

無(wú)標(biāo)題.png

作者: zhuls    時(shí)間: 2024-9-6 09:12
SBUF=DAT;是可以的,
如果你確定你近期內(nèi)不再使用DAT/SBUF,無(wú)視while(!TI)這句代碼。刪除它也是可以的。
同理,如果你一次只接收一個(gè)字節(jié)(8bit),那么接收中斷也可以取消,需要的時(shí)候再去取數(shù)。
作者: wufa1986    時(shí)間: 2024-9-6 09:18
是不占用,只是不等待的話程序復(fù)雜度會(huì)提高
作者: 黃youhui    時(shí)間: 2024-9-6 09:20
現(xiàn)在51單片機(jī)普遍集成了232串口?能問(wèn)下那幾款嗎?下次我試試
作者: ppcbug    時(shí)間: 2024-9-6 10:04
本來(lái) MCU 的串口 發(fā)送 也是可以工作在 中斷模式下的。

第一次, 手工填寫(xiě) 第一個(gè)字節(jié), SBUF =‘A'  
以后在中斷中:

XXXXXX interrupt 4
{
if(RI)
{

}
if(TI)
{
TI=0;
SBUF='B'  繼續(xù)發(fā)
}
}

只是 中斷UART發(fā)送  非常麻煩 還有不節(jié)省資源, 很少人用。
作者: newlined    時(shí)間: 2024-9-6 10:28
發(fā)表于 2024-9-6 09:20
現(xiàn)在51單片機(jī)普遍集成了232串口?能問(wèn)下那幾款嗎?下次我試試

我現(xiàn)在是用STC的單片機(jī),現(xiàn)在51的單片機(jī)都集成了串口,是不是我描述的不嚴(yán)謹(jǐn)?加了那種232收發(fā)器的接口才叫232串口?
作者: newlined    時(shí)間: 2024-9-6 10:54
ppcbug 發(fā)表于 2024-9-6 10:04
本來(lái) MCU 的串口 發(fā)送 也是可以工作在 中斷模式下的。

第一次, 手工填寫(xiě) 第一個(gè)字節(jié), SBUF =‘A'  

謝謝您及大家的回復(fù),看了大家的回復(fù)后,我領(lǐng)悟到我首貼描述的不嚴(yán)謹(jǐn),在發(fā)送單個(gè)字節(jié),不連續(xù)占用串口應(yīng)該是可以的,程序發(fā)不出去數(shù)據(jù)是因?yàn)樯弦淮蔚臄?shù)據(jù)沒(méi)有發(fā)送完成,連續(xù)往SBUF寫(xiě)數(shù)據(jù),造成數(shù)據(jù)丟失,編寫(xiě)程序時(shí)應(yīng)該判斷串口是否正在發(fā)送數(shù)據(jù),正在發(fā)送數(shù)據(jù)就不要往SBUF寫(xiě)了。我現(xiàn)在才明白,有一些程序,定義一個(gè)TI_BUSY,初始化為0,程序如下:串口中斷中是這樣:if (TI){TI=0;TI_BUSY=0;} 主程序是這樣:
while(TI_BUSY);SBUF=DAT;TI_BUSY=1;這樣數(shù)據(jù)在串口忙時(shí)就等待串口發(fā)送完成,再發(fā)送下一個(gè)數(shù)據(jù),需要浪費(fèi)CPU時(shí)間,但不丟數(shù)據(jù),我以前的程序就是這個(gè)路子,是不是如果發(fā)送數(shù)據(jù)的要求不是很?chē)?yán)格的情況下,也可以這樣編寫(xiě):串口中斷中還是跟以前一樣,主程序中是這樣:if (!TI_BUSY){SBUF=DAT;TI_BUSY=1},先判斷串口發(fā)送器是不是忙,如果忙就不往SBUF寫(xiě)數(shù)據(jù),等下次再寫(xiě)。

作者: xiaobendan001    時(shí)間: 2024-9-6 11:39
怎會(huì)很少人用呢?如果是只有一兩個(gè)字節(jié),等待還行,如果多了,就很費(fèi)時(shí)間,尤其是發(fā)送數(shù)量不確定的情況下,就更需要中斷方式了。發(fā)送先放入緩沖區(qū)里面,然后啟動(dòng),在中斷里面繼續(xù)直到發(fā)送完成。
作者: xuyaqi    時(shí)間: 2024-9-6 13:23
newlined 發(fā)表于 2024-9-6 09:04
謝謝您的回復(fù),CPU把8位要發(fā)送數(shù)據(jù)傳給串口硬件發(fā)送是需要時(shí)間,這個(gè)時(shí)間不是就是執(zhí)行 SBUF=DAT;的時(shí)間嗎 ...

SBUF=DAT 只是指令,CPU收到指令后要執(zhí)行,硬件把8位傳送完TI才置1。
作者: newlined    時(shí)間: 2024-9-6 14:26
ppcbug 發(fā)表于 2024-9-6 10:04
本來(lái) MCU 的串口 發(fā)送 也是可以工作在 中斷模式下的。

第一次, 手工填寫(xiě) 第一個(gè)字節(jié), SBUF =‘A'  

您的這個(gè)方法,能做到需要串口連續(xù)發(fā)數(shù)據(jù)時(shí),一股腦全部發(fā)完,一個(gè)字節(jié)接一個(gè)字節(jié),很巧妙,發(fā)完這一組數(shù)據(jù)后,需要再發(fā)時(shí),是不是需要再手工填寫(xiě)一個(gè)字節(jié), SBUF =‘A'  ?
作者: ppcbug    時(shí)間: 2024-9-6 14:36
newlined 發(fā)表于 2024-9-6 14:26
您的這個(gè)方法,能做到需要串口連續(xù)發(fā)數(shù)據(jù)時(shí),一股腦全部發(fā)完,一個(gè)字節(jié)接一個(gè)字節(jié),很巧妙,發(fā)完這一組數(shù) ...

是的。 待發(fā)緩沖發(fā)完以后,就不再產(chǎn)生發(fā)中斷了.
設(shè)置完新的發(fā)緩沖,必須在中斷外觸發(fā)一下, 讓它繼續(xù)產(chǎn)生 TI  發(fā)中斷。


作者: newlined    時(shí)間: 2024-9-7 08:05
不好意思各位,昨天下午測(cè)試程序,發(fā)現(xiàn)我在10貼中的程序有誤,要串口正確工作,如下程序是可以的:串口初始化,串口中斷中不對(duì)TI操作,主程序如下:SBUF=DAT; while(!TI);TI=0;主程序要等待串口發(fā)送完成,我原來(lái)想的CPU不等待串口的程序,現(xiàn)在還調(diào)試不通。
作者: newlined    時(shí)間: 2024-9-7 09:44
剛才程序驗(yàn)證,8樓ppcbug老師的方法是可行的。
作者: newlined    時(shí)間: 2024-9-7 10:04
剛才程序驗(yàn)證:10樓中我提到的方法也是可以的,程序每次跑到這里,如果串口不忙,就發(fā)送一個(gè)字節(jié)的數(shù)據(jù),忙就下一次發(fā)送。
作者: 人中狼    時(shí)間: 2024-9-7 10:27
newlined 發(fā)表于 2024-9-7 08:05
不好意思各位,昨天下午測(cè)試程序,發(fā)現(xiàn)我在10貼中的程序有誤,要串口正確工作,如下程序是可以的:串口初始 ...

先理解串口的基本工作原理吧
作者: newlined    時(shí)間: 2024-9-7 14:37
人中狼 發(fā)表于 2024-9-7 10:27
先理解串口的基本工作原理吧

這幾天正看的暈頭轉(zhuǎn)向中
作者: Graves    時(shí)間: 2024-9-7 15:38
完全可以看下stc的UART發(fā)送例程,有阻塞發(fā)送和隊(duì)列發(fā)送,阻塞發(fā)送就SBUF=DAT; while(!TI);TI=0;可以著重看看隊(duì)列發(fā)送的實(shí)現(xiàn)
作者: newlined    時(shí)間: 2024-9-9 08:53
qq475878026 發(fā)表于 2024-9-7 15:38
完全可以看下stc的UART發(fā)送例程,有阻塞發(fā)送和隊(duì)列發(fā)送,阻塞發(fā)送就SBUF=DAT; while(!TI);TI=0;可以著重看 ...

謝謝您的回帖,麻煩看看這兩個(gè)程序是隊(duì)列發(fā)送嗎?

STC32G-DEMO-CODE.rar

41.73 KB, 下載次數(shù): 1






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1