|
串口流控分為兩個(gè)部分:
1、RS232流控
RTS:終端我準(zhǔn)備發(fā)數(shù)據(jù)給你,快用CTS應(yīng)答,準(zhǔn)備好沒(méi)? CTS:好了,來(lái)吧
2、硬件流控
CTS:主機(jī),我有數(shù)據(jù),請(qǐng)求接收 RTS:我是主機(jī),就緒,請(qǐng)求發(fā)送。
硬件連接方式為:
以下為引用文章
用專(zhuān)用的控制線來(lái)發(fā)送 “停止”和“開(kāi)始”信號(hào)
RTS Request To Send 我可以接受數(shù)據(jù),請(qǐng)求發(fā)送數(shù)據(jù)給我 CTS Clear To Send 允許我發(fā)送數(shù)據(jù)給你? 當(dāng)一端 準(zhǔn)備接受數(shù)據(jù)時(shí), 它將RTS 升為 高電平(意思是 Request To Send to me). 如果它不能接受更多的數(shù)據(jù)時(shí), 它將RTS降為 低電平(表示stop sending to me),
對(duì)于PC機(jī), 或者non-modem這樣的終端設(shè)備, 它的CTS線 與 另外一端的 RTS線相連接
Linux系統(tǒng)只支持RTS/CTS流量控制 (當(dāng)然可以自己寫(xiě)一個(gè)特殊驅(qū)動(dòng)來(lái)支持DTR/DSR流量控制)
如果一端準(zhǔn)備停止接受, 它就將RTS降為 -5V, 意思是, request NOT to send to me(停止發(fā)送) 如果處理完畢,可以接受更多數(shù)據(jù)時(shí),將RTS拉為 高電平, 接收的數(shù)據(jù)流 就恢復(fù)了
流控信號(hào)的發(fā)送方向,跟 信息數(shù)據(jù)的發(fā)送 方向恰好是相反的
有時(shí)候,這兩個(gè)信號(hào)的定義,容易跟 原始的RTS的用途(I Request To Send to you)混淆, 用來(lái)請(qǐng)求發(fā)送, 跟數(shù)據(jù)的流動(dòng)方向相同。并且它只保護(hù)一個(gè)方向的數(shù)據(jù)流(從PC到modem的)
DTR,告訴別人自己上電了,可以操作了
硬件流控是靠軟件實(shí)現(xiàn)的,之所以強(qiáng)調(diào)“硬件”二字,僅僅是因?yàn)橛布骺靥峁┝擞糜诹髁壳闆r指示的硬件連線(CTS/RTS),并不是說(shuō),你只要把線連上,硬件就能自己流控。如果軟件不支持,光連上RTS和CTS是沒(méi)有用的。
軟件流控 不需要 額外的連線, 只需要TxD和RxD, 在數(shù)據(jù)通道上 發(fā)送特殊的流量控制字符來(lái)實(shí)現(xiàn)
DCB.fOutxCtsFlow = TRUE 表示, DTE的CTS信號(hào)在關(guān)閉狀態(tài)下, DTE將不能發(fā)送數(shù)據(jù), WriteFile() 會(huì)Pending狀態(tài).
1.流控制在串行通訊中的作用 這里講到的“流”,當(dāng)然指的是數(shù)據(jù)流。數(shù)據(jù)在兩個(gè)串口之間傳輸時(shí),常常會(huì)出現(xiàn)丟失數(shù)據(jù)的現(xiàn)象,或者兩臺(tái)計(jì)算機(jī)的處理速度不同,如臺(tái)式機(jī)與單片機(jī)之間的通訊,接收端數(shù)據(jù)緩沖區(qū)已滿,則此時(shí)繼續(xù)發(fā)送來(lái)的數(shù)據(jù)就會(huì)丟失?,F(xiàn)在我們?cè)诰W(wǎng)絡(luò)上通過(guò)MODEM進(jìn)行數(shù)據(jù)傳輸,這個(gè)問(wèn)題就尤為突出。流控制能解決這個(gè)問(wèn)題,當(dāng)接收端數(shù)據(jù)處理不過(guò)來(lái)時(shí),就發(fā)出“不再接收”的信號(hào),發(fā)送端就停止發(fā)送,直到收到“可以繼續(xù)發(fā)送”的信號(hào)再發(fā)送數(shù)據(jù)。因此流控制可以控制數(shù)據(jù)傳輸?shù)倪M(jìn)程,防止數(shù)據(jù)的丟失。 PC機(jī)中常用的兩種流控制是硬件流控制(包括RTS/CTS、DTR/CTS等)和軟件流控制XON/XOFF(繼續(xù)/停止),下面分別說(shuō)明。
2.硬件流控制 硬件流控制常用的有RTS/CTS流控制和DTR/DSR(數(shù)據(jù)終端就緒/數(shù)據(jù)設(shè)置就緒)流控制。 硬件流控制必須將相應(yīng)的電纜線連上,用RTS/CTS(請(qǐng)求發(fā)送/清除發(fā)送)流控制時(shí),應(yīng)將通訊兩端的RTS、CTS線對(duì)應(yīng)相連,數(shù)據(jù)終端設(shè)備(如計(jì)算機(jī))使用RTS來(lái)起始調(diào)制解調(diào)器或其它數(shù)據(jù)通訊設(shè)備的數(shù)據(jù)流,而數(shù)據(jù)通訊設(shè)備(如調(diào)制解調(diào)器)則用CTS來(lái)起動(dòng)和暫停來(lái)自計(jì)算機(jī)的數(shù)據(jù)流。這種硬件握手方式的過(guò)程為:我們?cè)诰幊虝r(shí)根據(jù)接收端緩沖區(qū)大小設(shè)置一個(gè)高位標(biāo)志(可為緩沖區(qū)大小的75%)和一個(gè)低位標(biāo)志(可為緩沖區(qū)大小的25%),當(dāng)緩沖區(qū)內(nèi)數(shù)據(jù)量達(dá)到高位時(shí),我們?cè)诮邮斩藢TS線置低電平(送邏輯0),當(dāng)發(fā)送端的程序檢測(cè)到CTS為低后,就停止發(fā)送數(shù)據(jù),直到接收端緩沖區(qū)的數(shù)據(jù)量低于低位而將CTS置高電平。RTS則用來(lái)標(biāo)明接收設(shè)備有沒(méi)有準(zhǔn)備好接收數(shù)據(jù)。 常用的流控制還有還有DTR/DSR(數(shù)據(jù)終端就緒/數(shù)據(jù)設(shè)置就緒)。我們?cè)诖瞬辉僭斒?。由于流控制的多樣?我個(gè)人認(rèn)為,當(dāng)軟件里用了流控制時(shí),應(yīng)做詳細(xì)的說(shuō)明,如何接線,如何應(yīng)用。
3.軟件流控制 由于電纜線的限制,我們?cè)谄胀ǖ目刂仆ㄓ嵵幸话悴挥糜布骺刂?而用軟件流控制。一般通過(guò)XON/XOFF來(lái)實(shí)現(xiàn)軟件流控制。常用方法是:當(dāng)接收端的輸入緩沖區(qū)內(nèi)數(shù)據(jù)量超過(guò)設(shè)定的高位時(shí),就向數(shù)據(jù)發(fā)送端發(fā)出XOFF字符(十進(jìn)制的19或Control-S,設(shè)備編程說(shuō)明書(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字符后就立即開(kāi)始發(fā)送數(shù)據(jù)。一般可以從設(shè)備配套源程序中找到發(fā)送的是什么字符。 應(yīng)該注意,若傳輸?shù)氖嵌M(jìn)制數(shù)據(jù),標(biāo)志字符也有可能在數(shù)據(jù)流中出現(xiàn)而引起誤操作,這是軟件流控制的缺陷,而硬件流控制不會(huì)有這個(gè)問(wèn)題。
|