英創(chuàng)Linux工控主板上的串口除了COM2為五線制的串口,其余都為三線制的串口,五線制的串口就是常說的使用了RTS/CTS流控的串口,在三線制串口的基礎(chǔ)上加入了流控信號,所以它的信號分別為RX,TX,RTS,CTS,GND。流控可以使數(shù)據(jù)接收設(shè)備在不能接收數(shù)據(jù)時(shí)通知數(shù)據(jù)發(fā)送設(shè)備,使其停止發(fā)送。 串口的流控經(jīng)常采用硬件流控和軟件流控兩種方式。像COM2這樣使用了RTS/CTS信號的就稱為硬件流控,下面我們來詳細(xì)介紹硬件流控的實(shí)現(xiàn)方式,硬件連接原理如下圖:
首先看RTS信號,RTS (Require To Send,發(fā)送請求)為輸出信號,用于指示本設(shè)備準(zhǔn)備好可接收數(shù)據(jù),低電平有效,低電平說明本設(shè)備可以接收數(shù)據(jù)。然后是CTS信號,CTS (Clear To Send,發(fā)送允許)為輸入信號,用于判斷是否可以向?qū)Ψ桨l(fā)送數(shù)據(jù),低電平有效,低電平說明本設(shè)備可以向?qū)Ψ桨l(fā)送數(shù)據(jù)。
我們以ESM335x為例來介紹實(shí)際的使用過程中,硬件流控的工作方式。COM2(ttyS1)有4K的接收緩沖區(qū),當(dāng)緩沖區(qū)沒有溢出,RTS信號始終輸出低電平,表示可以接收數(shù)據(jù),而CTS信號的電平取決于對方設(shè)備的RTS信號,當(dāng)對方設(shè)備緩沖區(qū)沒有溢出,RTS信號輸出低電平,板卡COM2的CTS信號也為低,表示可以向?qū)Ψ桨l(fā)送數(shù)據(jù),一旦設(shè)備的緩沖區(qū)滿了,就會將RTS信號拉高,板卡檢測到CTS信號為高,就會停止發(fā)送。所以在兩端設(shè)備處理速度不同時(shí),硬件流控可以避免出現(xiàn)由于接收緩沖溢出而出現(xiàn)的丟數(shù)據(jù)的現(xiàn)象,在很多高速串口的應(yīng)用中,也能看到硬件流控的身影。
接下來我們看看在軟件中如何設(shè)置,這里還是使用我們光盤中的例程step2_serialtest來做示例,在例程的基礎(chǔ)上,只需要修改一個語句和增加一個語句即可。我們需要將串口的參數(shù)port_info.c_cflag中的CRTSCTS位置為1,在我們的例程中已經(jīng)提供了接口,只用在CSerial::OpenPort中將info.flow_ctrl 的值修改為1,而info是標(biāo)準(zhǔn)的接口port_info結(jié)構(gòu)體:
typedefstructport_info
{
intbaud_rate;
intport_fd;
charparity;
charstop_bit;
charflow_ctrl;
chardata_bits;
}*pport_info;
structport_info info;
info.flow_ctrl = '1';
ESM335x工控板還需要需要將硬件流控的標(biāo)志位置為1,在open了COM2(ttyS1)之后調(diào)用一個ioctl就能夠?qū)崿F(xiàn)(ESM928x系列的主板可以省去這一步):
ioctl(m_fd,TIOCSERCONFIG);
這樣在程序上就已經(jīng)修改完成,只有五線制的串口COM2(ttyS1)能夠支持硬件流控,需要注意的是CTS信號默認(rèn)為輸入加有3.3V上拉,所以需要連接具有流控的串口設(shè)備或是將CTS信號拉低才能夠看到COM2口的輸出波形,如下圖所示,黃色為TX信號,藍(lán)色為CTS信號:
CTS信號為高,TX沒有輸出
CTS為低,TX有信號輸出
-
Linux
+關(guān)注
關(guān)注
87文章
11327瀏覽量
209965 -
嵌入式主板
+關(guān)注
關(guān)注
7文章
6086瀏覽量
35480
發(fā)布評論請先 登錄
相關(guān)推薦
評論