UART 通訊之RTC/CTS DTR/DSR流控制

NO IMAGE

 
  很久很久以前,計算機還沒有出現,那時就已經存在了(計算機)史前的串列埠裝置(電傳打字機,工控測量裝置,通訊調變解調器),為了連線這些串列埠,EIA制定了RS232標準,採用DB25接外掛,支援同步和非同步串列埠,D型的介面可以有效防止插反。標準化給使用帶來了便利。
    時光荏苒,個人計算機出現了,這些已有的串列埠裝置毫無疑問地成為了最初的外設,自然而然地RS232標準被個人計算機採納。但是裝置製造商傾向於體積更小,成本更低的介面,因此,將DB25中未使用的和支援同步模式的引腳去掉,形成DB9。最初的情況相當混亂,因為DB9只定義了訊號,卻沒有指定訊號和引腳的對應關係,各個製造商只能自行定義。幸運的是,IBM的PC成了工業標準,DB9逐漸統一到IBM的定義上來。
    DB9只有9根線,遵循RS232標準。定義如下:
    DTR,DSR——DTE裝置準備好/DCE裝置準備好。主流控訊號。
    RTS,CTS——請求傳送/清除傳送。用於半雙工時,收發切換。屬於輔助流控訊號。半雙工的意思是說,發的時候不收,收的時候不發。那麼怎麼區分收發呢?預設時是DCE向DTE傳送資料,當DTE決定向DCE發資料時,先有效RTS,表示DTE希望向DCE傳送,一般DCE不能馬上轉換收發狀態,DTE就通過監測CTS是否有效來判斷可否傳送,這樣避免了DTE在DCE未準備好時傳送所導致的資料丟失。
    全雙工時,這兩個訊號一直有效即可。
    
    隨著計算機的日益普及,很多非RS232的串列埠也要接入PC機,如果為每一種新出現的串列埠都增加一個新的I/O口顯然不現實,因為PC後面板位置有限,因此,將RS232串列埠和非RS232串列埠都通過RS232口接入是最佳方案。UART的U(通用)指的就是這個意思。早期ROM BIOS和DOS裡的通訊軟體都是為RS232設計的,在沒有檢測到DCD有效前不會傳送資料,因此,就連傳送一個字元這樣樸素的應用也要給出DCD、DTR、DSR等控制訊號。因此,串列埠接頭上要將一些控制線短接,或者乾脆繞過系統軟體自己寫通訊程式。
    到此,UART的涵義就總結為:通用的非同步 (序列) I/O口。
    就在UART冠以通用二字,準備一統江湖的時候,製造商們不滿於它的速度、體積和靈活性(軟體可配置),推出了USB和1394串列埠。目前,筆記本上的UART串列埠有被取消的趨勢,因而有網友發出了“沒有串列埠,吾誰與歸”的慨嘆,古今多少事,都付笑談中,USB取代UART是後話,暫且不表。
    話說自從賀氏(Hayes)公司推出了聰明貓(SmartModem),他們制定的MODEM介面就成了業界標準,自此以後,所有公司製造的相容貓都符合賀氏標準(連AT指令也相容,大家一起抄他唄)。
    細觀賀氏制定的MODEM串列埠,與RS232標準大不相同。DTR在整個通訊過程中一直保持有效,DSR在MODEM上電後/可以撥號前有效(取決於軟體對DSR的理解),在通訊過程的任意時刻,只要DTR/DSR無效,通訊過程立即終止。在某種意義上,這也可以算是流控,但肯定不是RS232所指的那種主流控。如果拘泥於RS232,你是不會理解DTR和DSR的用途的。
    賀氏不但改了DTR和DSR,竟然連RTS和CTS的涵義也重新定義了。因此,RTS和CTS已經不具有最開始的意義了。從字面理解RTS和CTS,是用於半雙工通訊的,當DTE想從收模式改為發模式時,就有效RTS請求傳送,DCE收到RTS請求後不能立即完成轉換,需要一段時間,然後有效CTS通知DTE:DCE已經轉到發模式,DTE可以開始傳送了。在全雙工時,RTS和CTS都預設置為有效即可。然而,在賀氏的MODEM串列埠定義中,RTS和CTS用於硬體流控,和什麼勞什子的全雙工/半雙工一點關係也沒有。
    注意,硬體流控是靠軟體實現的,之所以強調“硬體”二字,僅僅是因為硬體流控提供了用於流量情況指示的硬體連線,並不是說,你只要把線連上,硬體就能自己流控。如果軟體不支援,光連上RTS和CTS是沒有用的。
    RTS和CTS硬體流控的軟體演算法如下:(RTS有效表示PC機可以收,CTS有效表示MODEM可以收,這兩個訊號互相獨立,分別指示一個方向的流量情況。)

一、RS232標準中的RTS與CTS

RTS,CTS——請求傳送/清除傳送,用於半雙工時的收發切換,屬於輔助流控訊號。半雙工的意思是說,發的時候不收,收的時候不發。那麼怎麼區分收發呢?預設時是DCE向DTE傳送資料,當DTE決定向DCE發資料時,先有效RTS,表示DTE希望向DCE傳送。一般DCE不能馬上轉換收發狀態,DTE就通過監測CTS是否有效來判斷可否傳送,這樣避免了DTE在DCE未準備好時傳送所導致的資料丟失。

二、MODEM硬體流控中的RTS與CTS

按照SIMCOM公司的解釋,RTS和CTS是獨立,

1.RTS是模組的輸入端,用於MCU通知模組,MCU是否準備好,模組是否可向MCU傳送資訊,RTS的有效電平為低。 
2.CTS是模組的輸出端,用於模組通知MCU,模組是否準備好,MCU是否可向模組傳送資訊,CTS的有效電平為低 
從文字看,RTS和CTS是獨立的,不存在每次單向資料傳輸的發起者問題。如果主機輸出RTS有效,那麼模組有資料就會發往主機;如果模組輸出CTS有效,那麼主機就可以將資料送達模組接收。 
三、通訊協議中的RTS與CTS

RTS/CTS協議即請求傳送/允許傳送協議,相當於一種握手協議,主要用來解決”隱藏終端”問題。”隱藏終端”(Hidden Stations)是指,基站A向基站B傳送資訊,基站C未偵測到A也向B傳送,故A和C同時將訊號傳送至B,引起訊號衝突,最終導致傳送至B的訊號都丟失了。”隱藏終端”多發生在大型單元中(一般在室外環境),這將帶來效率損失,並且需要錯誤恢復機制。當需要傳送大容量檔案時,尤其需要杜絕”隱藏終端”現象的發生。IEEE802.11提供瞭如下解決方案。在引數配置中,若使用RTS/CTS協議,同時設定傳送上限位元組數—-一旦待傳送的資料大於此上限值時,即啟動RTS/CTS握手協議:首先,A向B傳送RTS訊號,表明A要向B傳送若干資料,B收到RTS後,向所有基站發出CTS訊號,表明已準備就緒,A可以傳送,其餘基站暫時”按兵不動”,然後,A向B傳送資料,最後,B接收完資料後,即向所有基站廣播ACK確認幀,這樣,所有基站又重新可以平等偵聽、競爭通道了。

硬體流控制解釋

解釋一:

RTS:終端我已經準備就緒,有資料就發過來吧
CTS:來了,接招

解釋二:
RTS:終端我準備發資料給你,快用CTS應答,準備好沒?
CTS:好了,來吧

解釋三:
CTS:主機,我有資料,請求接收
RTS:我是主機,就緒,請求傳送。

我今天弄了個SIM100模組,我將RTS設定無效之後,凡是要發往主機的資料都沒有發過來(包括主動資料RING),指令和指令返回結果都沒有返回,都快取在模組之中,等我將RTS設定有效後,快取的資料全發來了,包括一大堆指令的執行結果,由此,我覺得上面的“解釋一”應該正確,而“解釋二”應該是錯的,但“解釋三”是否正確呢?就是說CTS和RTS哪個是發起者呢?

答:
一是錯的
二是RS232標準
三是MODEM的硬體流控
SIMCOM公司的解釋完全正確
 
  PC端處理:
      發.:當 發現(不一定及時發現) CTS (-3v to -15v)無效時,停止傳送,
              當發現(不一定及時發現) CTS (3v to 15v)有效時,恢復傳送;

      收.:0<M<N<LEN_OF_RX_BUFFERS
              當接收buffers中的bytes<M 時,給 RTS 有效訊號( 3v to  15v),
              當接收buffers中的bytes>N 時,給 RTS 無效訊號(-3v to -15v);
    MODEM端處理:

          同上,但RTS與CTS交換。

         在RS232中本來CTS 與RTS 有明確的意義,但自從賀氏(HAYES ) 推出了聰明貓(SmartModem)後就有點混淆了。在RS232中RTS 與CTS 是用來半雙工模式下的方向切換;HAYES
Modem中的RTS ,CTS 是用來進 行硬體流控的。通常UART的RTC、CTS 的含義指後者,即用來做硬流控的。
        硬流控的RTS 、CTS :RTS (Require To Send,傳送請求)為輸出訊號,用於指示本裝置準備好可接收;CTS(Clear To Send,傳送清除)為輸入訊號,有效時停止傳送。假定A、B兩裝置通訊,A裝置的RTS 連線B裝置的CTS ;A裝置的CTS 連線B裝置 的RTS 。 前一路訊號控制B裝置的傳送,後一路訊號控制A裝置的傳送。對B裝置的傳送(A裝置接收)來說,如果A裝置接收緩衝快滿的時發出RTS 訊號(意思 通知B裝置停止傳送),B裝置通過CTS 檢測到該訊號,停止傳送;一段時間後A裝置接收緩衝有了空餘,發出RTS
訊號,指示B裝置開始傳送資料。A裝置發(B裝置接收) 類似。上述功能也能在資料流中插入Xoff(特殊字元)和Xon(另一個特殊字元)訊號來實現。A裝置一旦接收到B裝置傳送過來的Xoff,立刻停止發 送;反之,如接收到B裝置傳送過來的Xon,則恢復傳送資料給B裝置。同理,B裝置也類似,從而實現收發雙方的速度匹配。
        半雙工的方向切換:RS232中使用DTR(Date Terminal Ready,資料終端準備)與DSR(Data Set Ready ,資料裝置準備好)進行主流控,類似上述的RTS 與CTS 。對半雙工的通訊的DTE(Date Terminal Equipment,資料終端裝置)與DCE(Data circuit Equipment )來說,預設的方向是DTE接收,DCE傳送。如果DTE要傳送資料,必須發出RTS 訊號,請求傳送資料。DCE收到後如果 空閒則發出CTS 回 應RTS 信 號,表示響應請求,這樣通訊方向就變為DTE->TCE,同時RTS
與CTS 訊號必須一直保持。從這裡可以看出,CTS ,TRS雖 然也有點流控的意思(如CTS 沒有發出,DTE也不能傳送資料),但主要是用來進行方向切換的。
        如果UART只有RX、TX兩個訊號,要流控的話只能是軟流控;如果有RX,TX,CTS ,RTS 四個訊號,則多半是支援硬流控的UART;如果有 RX,TX,CTS ,RTS ,DTR,DSR 六個訊號的話,RS232標準的可能性比較大。
順便提一下:
DCD( Data Carrier Detect, 資料載波檢測):DCE向DTE指示,線路上檢測到載波。
RI(Ring Indicator,振鈴指示):DCE向DTE指示,有呼叫接入。