久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1840|回復: 20
打印 上一主題 下一主題
收起左側

有關RS232串行通信的問題,請教大家

[復制鏈接]
跳轉到指定樓層
樓主
ID:227818 發表于 2024-9-5 16:58 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
現在51單片機普遍集成了232串口,我的理解是既然集成了串口,收發都應該是不用占用CPU的時間的(中斷處理除外),在一些例程中,我發現單片機接收數據是這樣的,程序中初始化串口后,打開串口中斷,當串口接收數據完成后,會觸發串口中斷,在中斷程序中,只要 RI=0;DAT=SBUF;取走數據即可。在發送數據時,我原以為只要在主程序中 執行 SBUF=DAT;在串口中斷程序中有語句TI=0;就行。但實際中不行,數據發不出去,要這樣編寫程序,
SBUF=DAT;while(!TI); TI=0; 程序是這樣執行的,數據送到SBUF;觸發串口發送機制,CPU等待發送完成,然后清TI。為什么是這樣,數據送到SBUF,讓串口自己發送,發送完成后,通過中斷通知CPU不行嗎?以前那些沒有集成232串口,用外部232芯片的單片機,在發送數據時,也要等待數據發送完成嗎?謝謝。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:94031 發表于 2024-9-6 06:42 | 只看該作者
CPU把8位要發送數據傳給串口硬件發送是需要時間的,while(!TI); 就是等發完。
回復

使用道具 舉報

板凳
ID:60370 發表于 2024-9-6 08:41 | 只看該作者
建議看一看51單片機的結構原理你就會明白了,串口中斷沒有硬件清除中斷標志功能,至于232芯片只是增強傳輸距離作用而已。
回復

使用道具 舉報

地板
ID:227818 發表于 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
回復

使用道具 舉報

5#
ID:69038 發表于 2024-9-6 09:12 | 只看該作者
SBUF=DAT;是可以的,
如果你確定你近期內不再使用DAT/SBUF,無視while(!TI)這句代碼。刪除它也是可以的。
同理,如果你一次只接收一個字節(8bit),那么接收中斷也可以取消,需要的時候再去取數。

評分

參與人數 1黑幣 +15 收起 理由
newlined + 15

查看全部評分

回復

使用道具 舉報

6#
ID:879348 發表于 2024-9-6 09:18 | 只看該作者
是不占用,只是不等待的話程序復雜度會提高

評分

參與人數 1黑幣 +15 收起 理由
newlined + 15

查看全部評分

回復

使用道具 舉報

7#
ID:592807 發表于 2024-9-6 09:20 | 只看該作者
現在51單片機普遍集成了232串口?能問下那幾款嗎?下次我試試
回復

使用道具 舉報

8#
ID:628113 發表于 2024-9-6 10:04 | 只看該作者
本來 MCU 的串口 發送 也是可以工作在 中斷模式下的。

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

XXXXXX interrupt 4
{
if(RI)
{

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

只是 中斷UART發送  非常麻煩 還有不節省資源, 很少人用。

評分

參與人數 1黑幣 +15 收起 理由
newlined + 15

查看全部評分

回復

使用道具 舉報

9#
ID:227818 發表于 2024-9-6 10:28 | 只看該作者
發表于 2024-9-6 09:20
現在51單片機普遍集成了232串口?能問下那幾款嗎?下次我試試

我現在是用STC的單片機,現在51的單片機都集成了串口,是不是我描述的不嚴謹?加了那種232收發器的接口才叫232串口?
回復

使用道具 舉報

10#
ID:227818 發表于 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寫數據,等下次再寫。
回復

使用道具 舉報

11#
ID:1109793 發表于 2024-9-6 11:39 | 只看該作者
怎會很少人用呢?如果是只有一兩個字節,等待還行,如果多了,就很費時間,尤其是發送數量不確定的情況下,就更需要中斷方式了。發送先放入緩沖區里面,然后啟動,在中斷里面繼續直到發送完成。
回復

使用道具 舉報

12#
ID:94031 發表于 2024-9-6 13:23 | 只看該作者
newlined 發表于 2024-9-6 09:04
謝謝您的回復,CPU把8位要發送數據傳給串口硬件發送是需要時間,這個時間不是就是執行 SBUF=DAT;的時間嗎 ...

SBUF=DAT 只是指令,CPU收到指令后要執行,硬件把8位傳送完TI才置1。
回復

使用道具 舉報

13#
ID:227818 發表于 2024-9-6 14:26 | 只看該作者
ppcbug 發表于 2024-9-6 10:04
本來 MCU 的串口 發送 也是可以工作在 中斷模式下的。

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

您的這個方法,能做到需要串口連續發數據時,一股腦全部發完,一個字節接一個字節,很巧妙,發完這一組數據后,需要再發時,是不是需要再手工填寫一個字節, SBUF =‘A'  ?
回復

使用道具 舉報

14#
ID:628113 發表于 2024-9-6 14:36 | 只看該作者
newlined 發表于 2024-9-6 14:26
您的這個方法,能做到需要串口連續發數據時,一股腦全部發完,一個字節接一個字節,很巧妙,發完這一組數 ...

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

回復

使用道具 舉報

15#
ID:227818 發表于 2024-9-7 08:05 | 只看該作者
不好意思各位,昨天下午測試程序,發現我在10貼中的程序有誤,要串口正確工作,如下程序是可以的:串口初始化,串口中斷中不對TI操作,主程序如下:SBUF=DAT; while(!TI);TI=0;主程序要等待串口發送完成,我原來想的CPU不等待串口的程序,現在還調試不通。
回復

使用道具 舉報

16#
ID:227818 發表于 2024-9-7 09:44 | 只看該作者
剛才程序驗證,8樓ppcbug老師的方法是可行的。
回復

使用道具 舉報

17#
ID:227818 發表于 2024-9-7 10:04 | 只看該作者
剛才程序驗證:10樓中我提到的方法也是可以的,程序每次跑到這里,如果串口不忙,就發送一個字節的數據,忙就下一次發送。
回復

使用道具 舉報

18#
ID:384109 發表于 2024-9-7 10:27 | 只看該作者
newlined 發表于 2024-9-7 08:05
不好意思各位,昨天下午測試程序,發現我在10貼中的程序有誤,要串口正確工作,如下程序是可以的:串口初始 ...

先理解串口的基本工作原理吧
回復

使用道具 舉報

19#
ID:227818 發表于 2024-9-7 14:37 | 只看該作者
人中狼 發表于 2024-9-7 10:27
先理解串口的基本工作原理吧

這幾天正看的暈頭轉向中
回復

使用道具 舉報

20#
ID:192020 發表于 2024-9-7 15:38 | 只看該作者
完全可以看下stc的UART發送例程,有阻塞發送和隊列發送,阻塞發送就SBUF=DAT; while(!TI);TI=0;可以著重看看隊列發送的實現
回復

使用道具 舉報

21#
ID:227818 發表于 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

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人日韩av | 久久99精品久久久久久秒播九色 | 91精品国产综合久久久久蜜臀 | 中文字幕高清av | 九九热免费观看 | 天天干天天操 | 久久久看| 精品精品 | 久久久久久国产精品 | 福利成人 | 日本偷偷操 | 精品欧美一区二区精品久久久 | 人操人免费视频 | 国产精品久久久久久久久久久免费看 | 欧美专区在线 | 亚洲天堂一区 | 91一区二区 | 久色网| 精品国产一区二区在线 | 亚洲精品9999久久久久 | 亚洲午夜精品视频 | 尤物在线精品视频 | 中文字幕1区 | 精品中文字幕久久 | 亚洲成人在线视频播放 | 成人在线免费观看 | 久久久久久国产精品三区 | 91精品国产91久久久久福利 | 精品乱人伦一区二区三区 | 免费v片在线观看 | www.色婷婷| 国产农村妇女精品一二区 | a免费在线 | 日韩精品免费视频 | 国产视频中文字幕 | 欧产日产国产精品国产 | 久久精品久久精品久久精品 | 国产一区二区三区四区 | 日韩不卡一区二区 | 国产91精品网站 | 黄色网址大全在线观看 |