亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標題: 有關RS232串行通信的問題,請教大家 [打印本頁]

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


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

謝謝您的回復,CPU把8位要發送數據傳給串口硬件發送是需要時間,這個時間不是就是執行 SBUF=DAT;的時間嗎?您的意思是數據送到SBUF后就TI自動置1了?請看下面的時序圖,看起來執行SBUF=DAT后TI不置1,發送完成后才置1。

無標題.png (19.21 KB, 下載次數: 6)

無標題.png

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

第一次, 手工填寫 第一個字節, SBUF =‘A'  
以后在中斷中:

XXXXXX interrupt 4
{
if(RI)
{

}
if(TI)
{
TI=0;
SBUF='B'  繼續發
}
}

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

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

第一次, 手工填寫 第一個字節, SBUF =‘A'  

謝謝您及大家的回復,看了大家的回復后,我領悟到我首貼描述的不嚴謹,在發送單個字節,不連續占用串口應該是可以的,程序發不出去數據是因為上一次的數據沒有發送完成,連續往SBUF寫數據,造成數據丟失,編寫程序時應該判斷串口是否正在發送數據,正在發送數據就不要往SBUF寫了。我現在才明白,有一些程序,定義一個TI_BUSY,初始化為0,程序如下:串口中斷中是這樣:if (TI){TI=0;TI_BUSY=0;} 主程序是這樣:
while(TI_BUSY);SBUF=DAT;TI_BUSY=1;這樣數據在串口忙時就等待串口發送完成,再發送下一個數據,需要浪費CPU時間,但不丟數據,我以前的程序就是這個路子,是不是如果發送數據的要求不是很嚴格的情況下,也可以這樣編寫:串口中斷中還是跟以前一樣,主程序中是這樣:if (!TI_BUSY){SBUF=DAT;TI_BUSY=1},先判斷串口發送器是不是忙,如果忙就不往SBUF寫數據,等下次再寫。

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

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

第一次, 手工填寫 第一個字節, SBUF =‘A'  

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

是的。 待發緩沖發完以后,就不再產生發中斷了.
設置完新的發緩沖,必須在中斷外觸發一下, 讓它繼續產生 TI  發中斷。


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

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

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

謝謝您的回帖,麻煩看看這兩個程序是隊列發送嗎?

STC32G-DEMO-CODE.rar

41.73 KB, 下載次數: 1






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