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