UART中的硬件流控RTS與CTS
分享
UART中的硬件流控RTS與CTS
5/23/2013 5:13:04 PM at rock-chips inshenzhen
最近太忙了,沒時(shí)間寫對Ucos-II的移植,先將工作中容易搞錯的一個知識點(diǎn)記錄下來,關(guān)于CTS與RTS的。
在RS232中本來CTS 與RTS 有明確的意義,但自從賀氏(HAYES ) 推出了聰明貓(SmartModem)后就有點(diǎn)混淆了,不過現(xiàn)在這種意義為主流意義的,各大芯片制造廠家對UART控制器的流控基本采用HAYES MODEM流控解釋。
在RS232中RTS 與CTS 是用來半雙工模式下的方向切換,本文不解釋;
如果UART只有RX、TX兩個信號,要流控的話只能是軟流控;如果有RX,TX,CTS,RTS 四個信號,則多半是支持硬流控的UART;如果有 RX,TX,CTS ,RTS ,DTR,DSR 六個信號的話,RS232標(biāo)準(zhǔn)的可能性比較大。
SIMCOM公司對RTS/CTS的解釋:
(要注意區(qū)別是不是講串口支持硬流控的RTS/CTS,別看為益,在和瑞芯微調(diào)試硬件流控時(shí),別這個非主流的解釋搞得暈頭轉(zhuǎn)向的,下面用灰色小字體表示)
RTS是模塊的輸入端,用于MCU通知模塊,MCU是否準(zhǔn)備好,模塊是否可向MCU發(fā)送信息,RTS的有效電平為低。
CTS是模塊的輸出端,用于模塊通知MCU,模塊是否準(zhǔn)備好,MCU是否可向模塊發(fā)送信息,CTS的有效電平為低
HAYES Modem中的RTS ,CTS 是用來進(jìn) 行硬件流控的。現(xiàn)在通常UART的RTC、CTS的含義指后者,即用來做硬流控的。
硬流控的RTS、CTS:
(現(xiàn)在做串口使用RTS/CTS必看內(nèi)容,因?yàn)镸TK/)
RTS (Require ToSend,發(fā)送請求)為輸出信號,用于指示本設(shè)備準(zhǔn)備好可接收數(shù)據(jù),低電平有效,低電平說明本設(shè)備可以接收數(shù)據(jù)。
CTS (Clear ToSend,發(fā)送允許)為輸入信號,用于判斷是否可以向?qū)Ψ桨l(fā)送數(shù)據(jù),低電平有效,低電平說明本設(shè)備可以向?qū)Ψ桨l(fā)送數(shù)據(jù)。
此處有人將CTS翻譯為發(fā)送允許,我感覺的確比翻譯為清除發(fā)送好。因?yàn)镃TS是對方的RTS控制己方的CTS是否允許發(fā)送的功能。
用AP與MODEM采用流控收發(fā)串口數(shù)據(jù)舉例:
CTS 為輸入
RTS 為輸出
AP的CTS對接MODEM的RTS;MODEM的CTS對接AP的RTS。
默認(rèn)啟動時(shí):
AP的CTS為高
AP的RTS為低
MODEM的CTS 高 但極容易被拉低
MODEM的RTS 低
默認(rèn)休眠時(shí)
MODEM的CTS 高 但極容易被拉低
MODEM的RTS 高
其中CTS用電壓表測量電壓時(shí)發(fā)現(xiàn):在測量最初的大概200ms時(shí),為高電平,然后電壓值不斷下降,變成低電平,這說明CTS懸空時(shí)應(yīng)該為高,這中高電平僅僅是一定量的正電荷而已。
不知道芯片設(shè)計(jì)時(shí),規(guī)格說明書為什么要寫CTS默認(rèn)為高,CTS僅僅是輸入端,不需要什么默認(rèn)值啊。并且在流控打開情況下,不接CTS與RTS,也是可以正常3根線(RXD/TXD/GND)通信的,這說明不接RTS/CTS時(shí),CTS為低電平才對。為何實(shí)際使用與芯片規(guī)格說明書不一致,可能是被外殼金屬蓋干擾到低電平了,畢竟自己用的模塊,CTS是如此靠近低電平的金屬保護(hù)蓋,并且CTS為輸入口,沒有上拉下拉電平能力。
AP與MODEM的流控這樣通信的:
AP串口可用時(shí),將AP-RTS拉低,MODEM-CTS檢測到AP-RTS為低,知道AP串口已準(zhǔn)備好,可以發(fā)送數(shù)據(jù);
AP串口不可用時(shí),將AP-RTS拉高,MODEM-CTS檢測到AP-RTS為高,知道AP串口還未準(zhǔn)備好,就不會放數(shù)據(jù)。
MODEM串口可用與不可用時(shí)的交互是同樣道理。
沒有串口控制器,用中斷和普通IO口即可實(shí)現(xiàn)RTS與CTS功能。
RTS用GPIO實(shí)現(xiàn),串口就緒拉低電平,串口忙拉高電平
CTS用中斷實(shí)現(xiàn),檢測到低電平,將串口數(shù)據(jù)發(fā)送出去,檢測到高電平則保留串口數(shù)據(jù)直到檢測到低電平為止。
下面是摘錄網(wǎng)上有用的參考資料:
假定A、B兩設(shè)備通信,A設(shè)備的RTS 連接B設(shè)備的CTS ;A設(shè)備的CTS 連接B設(shè)備的RTS 。前一路信號控制B設(shè)備的發(fā)送,后一路信號控制A設(shè)備的發(fā)送。對B設(shè)備的發(fā)送(A設(shè)備接收)來說,如果A設(shè)備接收緩沖快滿的時(shí)發(fā)出RTS 信號(意思通知B設(shè)備停止發(fā)送),B設(shè)備通過CTS 檢測到該信號,停止發(fā)送;一段時(shí)間后A設(shè)備接收緩沖有了空余,發(fā)出RTS 信號,指示B設(shè)備開始發(fā)送數(shù)據(jù)。A設(shè)備發(fā)(B設(shè)備接收)類似。上述功能也能在數(shù)據(jù)流中插入Xoff(特殊字符)和Xon(另一個特殊字符)信號來實(shí)現(xiàn)。A設(shè)備一旦接收到B設(shè)備發(fā)送過來的Xoff,立刻停止發(fā) 送;反之,如接收到B設(shè)備發(fā)送過來的Xon,則恢復(fù)發(fā)送數(shù)據(jù)給B設(shè)備。同理,B設(shè)備也類似,從而實(shí)現(xiàn)收發(fā)雙方的速度匹配。
半雙工的方向切換:RS232中使用DTR(Date Terminal Ready,數(shù)據(jù)終端準(zhǔn)備)與DSR(Data Set Ready ,數(shù)據(jù)設(shè)備準(zhǔn)備好)進(jìn)行主流控,類似上述的RTS 與CTS 。對半雙工的通信的DTE(Date Terminal Equipment,數(shù)據(jù)終端設(shè)備)與DCE(Data circuitEquipment )來說,默認(rèn)的方向是DTE接收,DCE發(fā)送。如果DTE要發(fā)送數(shù)據(jù),必須發(fā)出RTS 信號,請求發(fā)送數(shù)據(jù)。DCE收到后如果空閑則發(fā)出CTS 回應(yīng)RTS 信號,表示響應(yīng)請求,這樣通信方向就變?yōu)镈TE->TCE,同時(shí)RTS 與CTS 信號必須一直保持。從這里可以看出,CTS ,TRS雖然也有點(diǎn)流控的意思(如CTS 沒有發(fā)出,DTE也不能發(fā)送數(shù)據(jù)),但主要是用來進(jìn)行方向切換的。
流控制在串行通訊中的作用
這里講到的“流”,當(dāng)然指的是數(shù)據(jù)流。數(shù)據(jù)在兩個串口之間傳輸時(shí),常常會出現(xiàn)丟失數(shù)據(jù)的現(xiàn)象,或者兩臺計(jì)算機(jī)的處理速度不同,如臺式機(jī)與單片機(jī)之間的通訊,接收端數(shù)據(jù)緩沖區(qū)已滿,則此時(shí)繼續(xù)發(fā)送來的數(shù)據(jù)就會丟失?,F(xiàn)在我們在網(wǎng)絡(luò)上通過MODEM進(jìn)行數(shù)據(jù)傳輸,這個問題就尤為突出。流控制能解決這個問題,當(dāng)接收端數(shù)據(jù)處理不過來時(shí),就發(fā)出“不再接收”的信號,發(fā)送端就停止發(fā)送,直到收到“可以繼續(xù)發(fā)送”的信號再發(fā)送數(shù)據(jù)。因此流控制可以控制數(shù)據(jù)傳輸?shù)倪M(jìn)程,防止數(shù)據(jù)的丟失。PC機(jī)中常用的兩種流控制是硬件流控制(包括RTS/CTS、DTR/CTS等)和軟件流控制XON/XOFF(繼續(xù)/停止),下面分別說明。
硬件流控制
硬件流控制常用的有RTS/CTS流控制和DTR/DSR(數(shù)據(jù)終端就緒/數(shù)據(jù)設(shè)置就緒)流控制。
硬件流控制必須將相應(yīng)的電纜線連上,用RTS/CTS(請求發(fā)送/清除發(fā)送)流控制時(shí),應(yīng)將通訊兩端的RTS、CTS線對應(yīng)相連,數(shù)據(jù)終端設(shè)備(如計(jì)算機(jī))使用RTS來起始調(diào)制解調(diào)器或其它數(shù)據(jù)通訊設(shè)備的數(shù)據(jù)流,而數(shù)據(jù)通訊設(shè)備(如調(diào)制解調(diào)器)則用CTS來起動和暫停來自計(jì)算機(jī)的數(shù)據(jù)流。這種硬件握手方式的過程為:我們在編程時(shí)根據(jù)接收端緩沖區(qū)大小設(shè)置一個高位標(biāo)志(可為緩沖區(qū)大小的75%)和一個低位標(biāo)志(可為緩沖區(qū)大小的25%),當(dāng)緩沖區(qū)內(nèi)數(shù)據(jù)量達(dá)到高位時(shí),我們在接收端將CTS線置低電平(送邏輯0),當(dāng)發(fā)送端的程序檢測到CTS為低后,就停止發(fā)送數(shù)據(jù),直到接收端緩沖區(qū)的數(shù)據(jù)量低于低位而將CTS置高電平。RTS則用來標(biāo)明接收設(shè)備有沒有準(zhǔn)備好接收數(shù)據(jù)。
常用的流控制還有還有DTR/DSR(數(shù)據(jù)終端就緒/數(shù)據(jù)設(shè)置就緒)。我們在此不再詳述。由于流控制的多樣性,我個人認(rèn)為,當(dāng)軟件里用了流控制時(shí),應(yīng)做詳細(xì)的說明,如何接線,如何應(yīng)用。
軟件流控制
由于電纜線的限制,我們在普通的控制通訊中一般不用硬件流控制,而用軟件流控制。一般通過XON/XOFF來實(shí)現(xiàn)軟件流控制。常用方法是:當(dāng)接收端的輸入緩沖區(qū)內(nèi)數(shù)據(jù)量超過設(shè)定的高位時(shí),就向數(shù)據(jù)發(fā)送端發(fā)出XOFF字符(十進(jìn)制的19或Control-S,設(shè)備編程說明書應(yīng)該有詳細(xì)闡述),發(fā)送端收到XOFF字符后就立即停止發(fā)送數(shù)據(jù);當(dāng)接收端的輸入緩沖區(qū)內(nèi)數(shù)據(jù)量低于設(shè)定的低位時(shí),就向數(shù)據(jù)發(fā)送端發(fā)出XON字符(十進(jìn)制的17或Control-Q),發(fā)送端收到XON字符后就立即開始發(fā)送數(shù)據(jù)。一般可以從設(shè)備配套源程序中找到發(fā)送的是什么字符。
應(yīng)該注意,若傳輸?shù)氖嵌M(jìn)制數(shù)據(jù),標(biāo)志字符也有可能在數(shù)據(jù)流中出現(xiàn)而引起誤操作,這是軟件流控制的缺陷,而硬件流控制不會有這個問題。
————————————————
版權(quán)聲明:本文為CSDN博主「zeroboundary」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zeroboundary/article/details/8966586
短信設(shè)備二次開發(fā)
2022-04-08
0
0
5/23/2013 5:13:04 PM at rock-chips inshenzhen
最近太忙了,沒時(shí)間寫對Ucos-II的移植,先將工作中容易搞錯的一個知識點(diǎn)記錄下來,關(guān)于CTS與RTS的。
在RS232中本來CTS 與RTS 有明確的意義,但自從賀氏(HAYES ) 推出了聰明貓(SmartModem)后就有點(diǎn)混淆了,不過現(xiàn)在這種意義為主流意義的,各大芯片制造廠家對UART控制器的流控基本采用HAYES MODEM流控解釋。
在RS232中RTS 與CTS 是用來半雙工模式下的方向切換,本文不解釋;
如果UART只有RX、TX兩個信號,要流控的話只能是軟流控;如果有RX,TX,CTS,RTS 四個信號,則多半是支持硬流控的UART;如果有 RX,TX,CTS ,RTS ,DTR,DSR 六個信號的話,RS232標(biāo)準(zhǔn)的可能性比較大。
SIMCOM公司對RTS/CTS的解釋:
(要注意區(qū)別是不是講串口支持硬流控的RTS/CTS,別看為益,在和瑞芯微調(diào)試硬件流控時(shí),別這個非主流的解釋搞得暈頭轉(zhuǎn)向的,下面用灰色小字體表示)
RTS是模塊的輸入端,用于MCU通知模塊,MCU是否準(zhǔn)備好,模塊是否可向MCU發(fā)送信息,RTS的有效電平為低。
CTS是模塊的輸出端,用于模塊通知MCU,模塊是否準(zhǔn)備好,MCU是否可向模塊發(fā)送信息,CTS的有效電平為低
HAYES Modem中的RTS ,CTS 是用來進(jìn) 行硬件流控的。現(xiàn)在通常UART的RTC、CTS的含義指后者,即用來做硬流控的。
硬流控的RTS、CTS:
(現(xiàn)在做串口使用RTS/CTS必看內(nèi)容,因?yàn)镸TK/)
RTS (Require ToSend,發(fā)送請求)為輸出信號,用于指示本設(shè)備準(zhǔn)備好可接收數(shù)據(jù),低電平有效,低電平說明本設(shè)備可以接收數(shù)據(jù)。
CTS (Clear ToSend,發(fā)送允許)為輸入信號,用于判斷是否可以向?qū)Ψ桨l(fā)送數(shù)據(jù),低電平有效,低電平說明本設(shè)備可以向?qū)Ψ桨l(fā)送數(shù)據(jù)。
此處有人將CTS翻譯為發(fā)送允許,我感覺的確比翻譯為清除發(fā)送好。因?yàn)镃TS是對方的RTS控制己方的CTS是否允許發(fā)送的功能。
用AP與MODEM采用流控收發(fā)串口數(shù)據(jù)舉例:
CTS 為輸入
RTS 為輸出
AP的CTS對接MODEM的RTS;MODEM的CTS對接AP的RTS。
默認(rèn)啟動時(shí):
AP的CTS為高
AP的RTS為低
MODEM的CTS 高 但極容易被拉低
MODEM的RTS 低
默認(rèn)休眠時(shí)
MODEM的CTS 高 但極容易被拉低
MODEM的RTS 高
其中CTS用電壓表測量電壓時(shí)發(fā)現(xiàn):在測量最初的大概200ms時(shí),為高電平,然后電壓值不斷下降,變成低電平,這說明CTS懸空時(shí)應(yīng)該為高,這中高電平僅僅是一定量的正電荷而已。
不知道芯片設(shè)計(jì)時(shí),規(guī)格說明書為什么要寫CTS默認(rèn)為高,CTS僅僅是輸入端,不需要什么默認(rèn)值啊。并且在流控打開情況下,不接CTS與RTS,也是可以正常3根線(RXD/TXD/GND)通信的,這說明不接RTS/CTS時(shí),CTS為低電平才對。為何實(shí)際使用與芯片規(guī)格說明書不一致,可能是被外殼金屬蓋干擾到低電平了,畢竟自己用的模塊,CTS是如此靠近低電平的金屬保護(hù)蓋,并且CTS為輸入口,沒有上拉下拉電平能力。
AP與MODEM的流控這樣通信的:
AP串口可用時(shí),將AP-RTS拉低,MODEM-CTS檢測到AP-RTS為低,知道AP串口已準(zhǔn)備好,可以發(fā)送數(shù)據(jù);
AP串口不可用時(shí),將AP-RTS拉高,MODEM-CTS檢測到AP-RTS為高,知道AP串口還未準(zhǔn)備好,就不會放數(shù)據(jù)。
MODEM串口可用與不可用時(shí)的交互是同樣道理。
沒有串口控制器,用中斷和普通IO口即可實(shí)現(xiàn)RTS與CTS功能。
RTS用GPIO實(shí)現(xiàn),串口就緒拉低電平,串口忙拉高電平
CTS用中斷實(shí)現(xiàn),檢測到低電平,將串口數(shù)據(jù)發(fā)送出去,檢測到高電平則保留串口數(shù)據(jù)直到檢測到低電平為止。
下面是摘錄網(wǎng)上有用的參考資料:
假定A、B兩設(shè)備通信,A設(shè)備的RTS 連接B設(shè)備的CTS ;A設(shè)備的CTS 連接B設(shè)備的RTS 。前一路信號控制B設(shè)備的發(fā)送,后一路信號控制A設(shè)備的發(fā)送。對B設(shè)備的發(fā)送(A設(shè)備接收)來說,如果A設(shè)備接收緩沖快滿的時(shí)發(fā)出RTS 信號(意思通知B設(shè)備停止發(fā)送),B設(shè)備通過CTS 檢測到該信號,停止發(fā)送;一段時(shí)間后A設(shè)備接收緩沖有了空余,發(fā)出RTS 信號,指示B設(shè)備開始發(fā)送數(shù)據(jù)。A設(shè)備發(fā)(B設(shè)備接收)類似。上述功能也能在數(shù)據(jù)流中插入Xoff(特殊字符)和Xon(另一個特殊字符)信號來實(shí)現(xiàn)。A設(shè)備一旦接收到B設(shè)備發(fā)送過來的Xoff,立刻停止發(fā) 送;反之,如接收到B設(shè)備發(fā)送過來的Xon,則恢復(fù)發(fā)送數(shù)據(jù)給B設(shè)備。同理,B設(shè)備也類似,從而實(shí)現(xiàn)收發(fā)雙方的速度匹配。
半雙工的方向切換:RS232中使用DTR(Date Terminal Ready,數(shù)據(jù)終端準(zhǔn)備)與DSR(Data Set Ready ,數(shù)據(jù)設(shè)備準(zhǔn)備好)進(jìn)行主流控,類似上述的RTS 與CTS 。對半雙工的通信的DTE(Date Terminal Equipment,數(shù)據(jù)終端設(shè)備)與DCE(Data circuitEquipment )來說,默認(rèn)的方向是DTE接收,DCE發(fā)送。如果DTE要發(fā)送數(shù)據(jù),必須發(fā)出RTS 信號,請求發(fā)送數(shù)據(jù)。DCE收到后如果空閑則發(fā)出CTS 回應(yīng)RTS 信號,表示響應(yīng)請求,這樣通信方向就變?yōu)镈TE->TCE,同時(shí)RTS 與CTS 信號必須一直保持。從這里可以看出,CTS ,TRS雖然也有點(diǎn)流控的意思(如CTS 沒有發(fā)出,DTE也不能發(fā)送數(shù)據(jù)),但主要是用來進(jìn)行方向切換的。
流控制在串行通訊中的作用
這里講到的“流”,當(dāng)然指的是數(shù)據(jù)流。數(shù)據(jù)在兩個串口之間傳輸時(shí),常常會出現(xiàn)丟失數(shù)據(jù)的現(xiàn)象,或者兩臺計(jì)算機(jī)的處理速度不同,如臺式機(jī)與單片機(jī)之間的通訊,接收端數(shù)據(jù)緩沖區(qū)已滿,則此時(shí)繼續(xù)發(fā)送來的數(shù)據(jù)就會丟失?,F(xiàn)在我們在網(wǎng)絡(luò)上通過MODEM進(jìn)行數(shù)據(jù)傳輸,這個問題就尤為突出。流控制能解決這個問題,當(dāng)接收端數(shù)據(jù)處理不過來時(shí),就發(fā)出“不再接收”的信號,發(fā)送端就停止發(fā)送,直到收到“可以繼續(xù)發(fā)送”的信號再發(fā)送數(shù)據(jù)。因此流控制可以控制數(shù)據(jù)傳輸?shù)倪M(jìn)程,防止數(shù)據(jù)的丟失。PC機(jī)中常用的兩種流控制是硬件流控制(包括RTS/CTS、DTR/CTS等)和軟件流控制XON/XOFF(繼續(xù)/停止),下面分別說明。
硬件流控制
硬件流控制常用的有RTS/CTS流控制和DTR/DSR(數(shù)據(jù)終端就緒/數(shù)據(jù)設(shè)置就緒)流控制。
硬件流控制必須將相應(yīng)的電纜線連上,用RTS/CTS(請求發(fā)送/清除發(fā)送)流控制時(shí),應(yīng)將通訊兩端的RTS、CTS線對應(yīng)相連,數(shù)據(jù)終端設(shè)備(如計(jì)算機(jī))使用RTS來起始調(diào)制解調(diào)器或其它數(shù)據(jù)通訊設(shè)備的數(shù)據(jù)流,而數(shù)據(jù)通訊設(shè)備(如調(diào)制解調(diào)器)則用CTS來起動和暫停來自計(jì)算機(jī)的數(shù)據(jù)流。這種硬件握手方式的過程為:我們在編程時(shí)根據(jù)接收端緩沖區(qū)大小設(shè)置一個高位標(biāo)志(可為緩沖區(qū)大小的75%)和一個低位標(biāo)志(可為緩沖區(qū)大小的25%),當(dāng)緩沖區(qū)內(nèi)數(shù)據(jù)量達(dá)到高位時(shí),我們在接收端將CTS線置低電平(送邏輯0),當(dāng)發(fā)送端的程序檢測到CTS為低后,就停止發(fā)送數(shù)據(jù),直到接收端緩沖區(qū)的數(shù)據(jù)量低于低位而將CTS置高電平。RTS則用來標(biāo)明接收設(shè)備有沒有準(zhǔn)備好接收數(shù)據(jù)。
常用的流控制還有還有DTR/DSR(數(shù)據(jù)終端就緒/數(shù)據(jù)設(shè)置就緒)。我們在此不再詳述。由于流控制的多樣性,我個人認(rèn)為,當(dāng)軟件里用了流控制時(shí),應(yīng)做詳細(xì)的說明,如何接線,如何應(yīng)用。
軟件流控制
由于電纜線的限制,我們在普通的控制通訊中一般不用硬件流控制,而用軟件流控制。一般通過XON/XOFF來實(shí)現(xiàn)軟件流控制。常用方法是:當(dāng)接收端的輸入緩沖區(qū)內(nèi)數(shù)據(jù)量超過設(shè)定的高位時(shí),就向數(shù)據(jù)發(fā)送端發(fā)出XOFF字符(十進(jìn)制的19或Control-S,設(shè)備編程說明書應(yīng)該有詳細(xì)闡述),發(fā)送端收到XOFF字符后就立即停止發(fā)送數(shù)據(jù);當(dāng)接收端的輸入緩沖區(qū)內(nèi)數(shù)據(jù)量低于設(shè)定的低位時(shí),就向數(shù)據(jù)發(fā)送端發(fā)出XON字符(十進(jìn)制的17或Control-Q),發(fā)送端收到XON字符后就立即開始發(fā)送數(shù)據(jù)。一般可以從設(shè)備配套源程序中找到發(fā)送的是什么字符。
應(yīng)該注意,若傳輸?shù)氖嵌M(jìn)制數(shù)據(jù),標(biāo)志字符也有可能在數(shù)據(jù)流中出現(xiàn)而引起誤操作,這是軟件流控制的缺陷,而硬件流控制不會有這個問題。
————————————————
版權(quán)聲明:本文為CSDN博主「zeroboundary」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zeroboundary/article/details/8966586