在RS232 中本來 CTS 與 RTS 有明確的意義,但自從賀氏(HAYES ) 推出了聰明貓(SmartModem)后就有點混淆了,不過現在這種意義為主流意義的,各大芯片制造廠家對 UART 控制器的流控基本采用 HAYES MODEM 流控解釋。
在 RS232 中 RTS 與 CTS 是用來半雙工模式下的方向切換,本文不解釋;
如果 UART 只有 RX、TX 兩個信號,要流控的話只能是軟流控;如果有 RX,TX,CTS,RTS 四個信號,則多半是支持硬流控的 UART;如果有 RX,TX,CTS ,RTS ,DTR,DSR 六個信號的話,RS232 標準的可能性比較大。
(要注意區(qū)別是不是講串口支持硬流控的 RTS/CTS,別看為益,在和瑞芯微調試硬件流控時,被這個非主流的解釋搞得暈頭轉向的)
RTS 是模塊的輸入端,用于 MCU 通知模塊,MCU 是否準備好,模塊是否可向 MCU 發(fā)送信息,RTS 的有效電平為低。
CTS 是模塊的輸出端,用于模塊通知 MCU,模塊是否準備好,MCU 是否可向模塊發(fā)送信息,CTS 的有效電平為低
HAYES Modem 中的 RTS ,CTS 是用來進 行硬件流控的。現在通常 UART 的 RTC、CTS 的含義指后者,即用來做硬流控的。
硬流控的 RTS、CTS:
(現在做串口使用 RTS/CTS 必看內容,因為 MTK/)
RTS (Require ToSend,發(fā)送請求)為輸出信號,用于指示本設備準備好可接收數據,低電平有效,低電平說明本設備可以接收數據。
CTS (Clear ToSend,發(fā)送允許)為輸入信號,用于判斷是否可以向對方發(fā)送數據,低電平有效,低電平說明本設備可以向對方發(fā)送數據。
此處有人將 CTS 翻譯為發(fā)送允許,我感覺的確比翻譯為清除發(fā)送好。因為 CTS 是對方的 RTS 控制己方的 CTS 是否允許發(fā)送的功能。
用 AP 與 MODEM 采用流控收發(fā)串口數據舉例:
CTS 為輸入
RTS 為輸出
AP 的 CTS 對接 MODEM 的 RTS;MODEM 的 CTS 對接 AP 的 RTS。
默認啟動時:
AP 的 CTS 為高
AP 的 RTS 為低
MODEM 的 CTS 高 但極容易被拉低
MODEM 的 RTS 低
默認休眠時
MODEM 的 CTS 高 但極容易被拉低
MODEM 的 RTS 高
其中 CTS 用電壓表測量電壓時發(fā)現:在測量最初的大概 200ms 時,為高電平,然后電壓值不斷下降,變成低電平,這說明 CTS 懸空時應該為高,這中高電平僅僅是一定量的正電荷而已。
不知道芯片設計時,規(guī)格說明書為什么要寫 CTS 默認為高,CTS 僅僅是輸入端,不需要什么默認值啊。并且在流控打開情況下,不接 CTS 與 RTS,也是可以正常 3 根線(RXD/TXD/GND)通信的,這說明不接 RTS/CTS 時,CTS 為低電平才對。為何實際使用與芯片規(guī)格說明書不一致,可能是被外殼金屬蓋干擾到低電平了,畢竟自己用的模塊,CTS 是如此靠近低電平的金屬保護蓋,并且 CTS 為輸入口,沒有上拉下拉電平能力。
AP 與 MODEM 的流控這樣通信的:
AP 串口可用時,將 AP-RTS 拉低,MODEM-CTS 檢測到 AP-RTS 為低,知道 AP 串口已準備好,可以發(fā)送數據;
AP 串口不可用時,將 AP-RTS 拉高,MODEM-CTS 檢測到 AP-RTS 為高,知道 AP 串口還未準備好,就不會放數據。
MODEM 串口可用與不可用時的交互是同樣道理。
沒有串口控制器,用中斷和普通 IO 口即可實現 RTS 與 CTS 功能。
RTS 用 GPIO 實現,串口就緒(無數據發(fā)送,等待接收)拉低電平,串口忙(自己有數據發(fā)送)拉高電平
CTS 用中斷實現,檢測到低電平,將串口數據發(fā)送出去,檢測到高電平則保留串口數據直到檢測到低電平為止。
下面是摘錄網上有用的參考資料:
假定 A、B 兩設備通信,A 設備的 RTS 連接 B 設備的 CTS ;A 設備的 CTS 連接 B 設備的 RTS 。
前一路信號控制 B 設備的發(fā)送,后一路信號控制 A 設備的發(fā)送。對 B 設備的發(fā)送(A 設備接收)來說,如果 A 設備接收緩沖快滿的時發(fā)出 RTS 信號(RTS 拉高,RTS 無效,告知對方停止發(fā)送),通知 B 設備停止發(fā)送,B 設備通過 CTS 檢測到該信號,停止發(fā)送;一段時間后 A 設備接收緩沖有了空余,發(fā)出 RTS 信號(RTS 拉低,RTS 有效,請求發(fā)送),指示 B 設備開始發(fā)送數據。A 設備發(fā)(B 設備接收)類似。
上述功能也能在數據流中插入 Xoff(特殊字符)和 Xon(另一個特殊字符)信號來實現。A 設備一旦接收到 B 設備發(fā)送過來的 Xoff,立刻停止發(fā)送;反之,如接收到 B 設備發(fā)送過來的 Xon,則恢復發(fā)送數據給 B 設備。同理,B 設備也類似,從而實現收發(fā)雙方的速度匹配。
半雙工的方向切換:RS232 中使用 DTR(Date Terminal Ready,數據終端準備)與 DSR(Data Set Ready ,數據設備準備好)進行主流控,類似上述的 RTS 與 CTS 。對半雙工的通信的 DTE(Date Terminal Equipment,數據終端設備)與 DCE(Data circuitEquipment )來說,默認的方向是 DTE 接收,DCE 發(fā)送。如果 DTE 要發(fā)送數據,必須發(fā)出 RTS 信號,請求發(fā)送數據。DCE 收到后如果空閑則發(fā)出 CTS 回應 RTS 信號,表示響應請求,這樣通信方向就變?yōu)?DTE-》TCE,同時 RTS 與 CTS 信號必須一直保持。從這里可以看出,CTS ,TRS 雖然也有點流控的意思(如 CTS 沒有發(fā)出,DTE 也不能發(fā)送數據),但主要是用來進行方向切換的。
流控制在串行通訊中的作用
這里講到的“流”,當然指的是數據流。數據在兩個串口之間傳輸時,常常會出現丟失數據的現象,或者兩臺計算機的處理速度不同,如臺式機與單片機之間的通訊,接收端數據緩沖區(qū)已滿,則此時繼續(xù)發(fā)送來的數據就會丟失?,F在我們在網絡上通過 MODEM 進行數據傳輸,這個問題就尤為突出。流控制能解決這個問題,當接收端數據處理不過來時,就發(fā)出“不再接收”的信號,發(fā)送端就停止發(fā)送,直到收到“可以繼續(xù)發(fā)送”的信號再發(fā)送數據。因此流控制可以控制數據傳輸的進程,防止數據的丟失。PC 機中常用的兩種流控制是硬件流控制(包括 RTS/CTS、DTR/CTS 等)和軟件流控制 XON/XOFF(繼續(xù) / 停止),下面分別說明。
硬件流控制
硬件流控制常用的有 RTS/CTS 流控制和 DTR/DSR(數據終端就緒 / 數據設置就緒)流控制。
硬件流控制必須將相應的電纜線連上,用 RTS/CTS(請求發(fā)送 / 清除發(fā)送)流控制時,應將通訊兩端的 RTS、CTS 線對應相連,數據終端設備(如計算機)使用 RTS 來起始調制解調器或其它數據通訊設備的數據流,而數據通訊設備(如調制解調器)則用 CTS 來起動和暫停來自計算機的數據流。這種硬件握手方式的過程為:我們在編程時根據接收端緩沖區(qū)大小設置一個高位標志(可為緩沖區(qū)大小的 75%)和一個低位標志(可為緩沖區(qū)大小的 25%),當緩沖區(qū)內數據量達到高位時,我們在接收端將 CTS 線置低電平(送邏輯 0),當發(fā)送端的程序檢測到 CTS 為低后,就停止發(fā)送數據,直到接收端緩沖區(qū)的數據量低于低位而將 CTS 置高電平。RTS 則用來標明接收設備有沒有準備好接收數據。
常用的流控制還有還有 DTR/DSR(數據終端就緒 / 數據設置就緒)。我們在此不再詳述。由于流控制的多樣性,我個人認為,當軟件里用了流控制時,應做詳細的說明,如何接線,如何應用。
軟件流控制
由于電纜線的限制,我們在普通的控制通訊中一般不用硬件流控制,而用軟件流控制。一般通過 XON/XOFF 來實現軟件流控制。常用方法是:當接收端的輸入緩沖區(qū)內數據量超過設定的高位時,就向數據發(fā)送端發(fā)出 XOFF 字符(十進制的 19 或 Control-S,設備編程說明書應該有詳細闡述),發(fā)送端收到 XOFF 字符后就立即停止發(fā)送數據;當接收端的輸入緩沖區(qū)內數據量低于設定的低位時,就向數據發(fā)送端發(fā)出 XON 字符(十進制的 17 或 Control-Q),發(fā)送端收到 XON 字符后就立即開始發(fā)送數據。一般可以從設備配套源程序中找到發(fā)送的是什么字符。
應該注意,若傳輸的是二進制數據,標志字符也有可能在數據流中出現而引起誤操作,這是軟件流控制的缺陷,而硬件流控制不會有這個問題。
問題
1.UART 和 RS232 是什么關系?
UART(Universal Asynchronization Receviver/Transmite) 可以作為一種軟件接口協議來看,包括 RS232、RS485、RS422 等接口標準規(guī)范和總線標準規(guī)范,這些標準規(guī)定了接口的電氣特性(如電平)、傳輸速率、連接特性等,實際上屬于通信網絡中的物理層的概念,與通信協議沒有直接關系,通信協議一般屬于鏈路層即 link 層的概念。
那么 RS232 和 TTL 的 uart 什么關系呢?都是 uart 協議,就像上述提到的,只是電氣特性如電平不同。
2.UART 是全雙工通信,為何需要 RTS 和 CTS 來控制方向呢?
在 uart 全雙工通信中是不需要 RTS 和 CTS 的,二者只是用在半雙工通信中,如 RS485.
3. 在很多芯片手冊中,uart 支持 IrDA(紅外)和 RS485 模式,支持 RS485 模式是什么概念呢?
在 SAM4S 芯片手冊中,RS485 模式是如下這么描述的:
While operating in RS485 mode, the USART behaves as though in Async or Sync mode and configuration of all the parameters is possible 。
The difference is that the RTS pin is driven high when the transmitter is operating.
The RTS pin is controlled by TXEMPTY bit.
也就是說在 RS485 模式下,區(qū)別于正常模式在于當處于發(fā)送情況下,RTS 腳是拉高的,一旦發(fā)送結束(TXEMPTY 置位),RTS 拉低,通知對方可以發(fā)送數據,從而完成硬件自動流控。
下面圖 1 為 SAM4S 的 RS485 模式連接圖,圖 2 為 i.MX6 的的 RS485 模式連接圖。
4. 通常情況,串口起始位和停止位分別什么電平來表示?
起始位通常為低電平,用來同步;停止位為高電平,用來表示幀結束。
編輯:hfy
-
mcu
+關注
關注
146文章
16922瀏覽量
349995 -
modem
+關注
關注
0文章
98瀏覽量
37555 -
RS232
+關注
關注
13文章
733瀏覽量
94199
發(fā)布評論請先 登錄
相關推薦
評論