一般在串行通訊中,我們會在一些上位機上看到 RTS/CTS、DTR/DSR和 XON/XOFF的選項,這是對流控制的選項,一般是應用於 RS232接口的,是拿來調制解調器的數據通訊的
一、流控制的作用
這裏講到的 “流”,指的是數據流;在數據通信中,流控制是管理兩個節點之間數據傳輸速率的過程,以防止出現接收端的數據緩衝區已滿,而發送端依然繼續發送數據,所導致數據丟失
二、工作原理
當接收端的數據緩衝區已滿,無法處理數據來時,就發出 “不再接收” 的信號,發送端則停止發送,直到發送端收到 “可以繼續發送” 的信號再發送數據。計算機中常用的兩種流控制分別是硬件流控制(RTS/CTS、DTR/DSR等)和軟件流控制(XON/XOFF)
三、RS232引腳定義
RS-232設計之初是用來連接調制解調器做傳輸之用,也因此它的腳位意義通常也和調制解調器傳輸有關。RS-232的設備可以分爲數據終端設備(DTE,Data Terminal Equipment, For example, PC)和數據通信設備(DCE,Data Communication Equipment)兩類,這種分類定義了不同的線路用來發送和接受信號。一般來說,計算機和終端設備有DTE連接器,調制解調器和打印機有DCE連接器。但是這麼說並不是總是嚴格正確的,用配線分接器測試連接,或者用試誤法來判斷電纜是否工作,常常需要參考相關的文件說明
RS-232目前有 DB-25和 DB-9型的連接器,被用的較多的是 DB-9型的接口
RS-232中 DB-9型的管腳分配:
DB-9 Male(Pin Side) DB-9 Female (Pin Side)
------------- -------------
\ 1 2 3 4 5 / \ 5 4 3 2 1 /
\ 6 7 8 9 / \ 9 8 7 6 /
--------- ---------
它的信號引腳說明:
腳位 | 簡寫 | 意義 | 信號 | 說明 |
---|---|---|---|---|
Pin1 | DCD | Data Carrier Detect | 數據載波檢測(DCD) | 調制解調器通知電腦有載波被偵測到。 |
Pin2 | RXD | Receiver | 接受數據(RD、RXD) | 接收數據。 |
Pin3 | TXD | Transmit | 發送數據(TD、TXD) | 發送數據。 |
Pin4 | DTR | Data Terminal Ready | 數據終端準備(DTR) | 電腦告訴調制解調器可以進行傳輸。 |
Pin5 | GND | Ground | 公共接地 | 地線。 |
Pin6 | DSR | Data Set Ready | 數據準備好(DSR) | 調制解調器告訴電腦一切準備就緒。 |
Pin7 | RTS | Request To Send | 請求發送(RTS) | 電腦要求調制解調器將數據提交。 |
Pin8 | CTS | Clear To Send | 清除發送(CTS) | 調制解調器通知電腦可以傳數據過來。 |
Pin9 | RI | Ring Indicator | 振鈴指示(RI) | 調制解調器通知電腦有電話進來。 |
四、硬件流控制(以 RTS/CTS爲主)
RTS/CTS最初是設計爲電傳打字機和調制解調器半雙工協作通信的,每次它只能一方調制解調器發送數據。終端必須發送請求發送信號然後等到調制解調器迴應清除發送信號。儘管 RTS/CTS是通過硬件達到握手,但它有自己的優勢
1、RS232的標準連線法
當 A端的設備準備好後,發出 DTR(數據設備就緒)信號, 傳至 B端的 RI(響鈴)和 DSR(通訊設備就緒)。 這樣,只要 A準備好(DTR),B端就會產生呼叫(RI)並準備好(DSR)。
注意到 A端的RTS(請求發送)、CTS(允許發送)和 B端的 CD(載波檢測)連在一起, 則說明 A一旦請求發送(RTS)將立即得到允許(CTS), 並使 B端檢測到載波信號(CD)。 A端的 TXD與 B端的 RXD相連,A發送,B接收。
2、RS232的簡化連線法
原來 RTS和 CTS是用來詢問和回答是否可以傳輸數據。 但在這種連接方式下,就成了純粹告訴對方自己是否可以進行通訊。 此時 RTS和 DTR都可以用來對數據流進行控制。
A端的 DTR(數據設備就緒)發出信號, 當 B端準備好後,B端的 DTR(數據設備就緒)向 A端的DSR(通訊設備就緒)發出信號。 接下來就可以通過 RTS(請求發送)和 DTR(允許發送)來控制通信。
3、進一步簡化(也就是以 RTS/CTS爲主)
從上面的流程可以看到,硬件流控制主要是 RTS/CTS和 DTR/DSR來控制,但是,人嘛,能懶就懶,因此現在很多時候都只是用 RTS/CTS告訴對方自己是否可以進行通訊,而直接跳過了 DTR/DSR的就緒狀態檢測
在使用 RTS/CTS時,它們都是低電平有效,因此,一般在上位機中一旦打開串口,RTS會拉置高電平,然後等待數據發送,使得低電平有效
值得注意的,並不是說硬件流控制就單純的依靠硬件,它還需要軟件去處理識別,因爲硬件流控制所做的只是給出信號電平,真正的控制發送使能還得看軟件的處理
五、軟件流控制
軟件流控制(Software flow control)是在計算機數據鏈路中的一種流控制方法,特別適用於 RS-232串口通信;它是採用特殊字符來傳輸帶內信令,特殊編碼字符稱作 XOFF與 XON(分別表示 “transmit off” 與 “transmit on”)。因此,也被稱作 “XON/XOFF流控制”;
使用 ASCII字符集,XOFF一般爲字節值 19(十進制),XON爲字節值 17
碼的名字 | 含義 | ASCII | 十進制 | 十六進制 |
---|---|---|---|---|
XOFF | 暫停傳輸 | DC3 | 19 | 13 |
XON | 恢復傳輸 | DC1 | 17 | 11 |
值得注意的是:是接受方把 XON/XOFF信號發給發送方來控制發送方何時發送數據的,這些信號是與發送數據的傳輸方向相反的
它的處理主要是:接收方利用 XON信號告訴發送方,我已經準備好接受更多的數據了,利用 XOFF信號告訴發送方停止發送數據,直到接受方發送 XON信號告訴發送方我再次準備好了。
XON/XOFF是一種工作在終端間的帶內方法,但是必須兩端都支持這個協議,而且在突然啓動的時候會有混淆的可能;XON/XOFF可以工作於 3線的接口
軟件流控制廣泛用於低速設備,特別是打印機與啞終端,用以指出它們臨時暫停接收數據;軟件流控制的優點是降低了收發雙方之間的電路導體數量,給定一個共同的電路接地,只需要兩條電路分別用於收發,也不需要額外的特定硬件實現;缺點是發送 XOFF需要至少一個字符的時間,而且需要排在對方已經接收的數據之後處理
XON/XOFF一般不贊成使用,推薦用 RTS/CTS控制流來代替它們。 因爲若是傳輸的是二進制數據,可能你發送的數據裏面也有 XON、XOFF對應的二進制值出現,進而引起誤操作,這是軟件流控制的缺陷,而硬件流控制不會有這個問題;當然,你也可以對 XON、XOFF進行轉義
六、UART底層控制
上面也有說到,硬件流控制最後的實現還是繞到了軟件上,若果是去寫串口上位機控制的,可以看一下下面的鏈接,瞭解它們對應的寄存器
鏈接:串列埠的原理與應用