Linux上的串列埠程式設計

2021-09-11 20:59:59 字數 3542 閱讀 9521

linux下的傳統硬體串列埠命名為ttys ,其中可以是1,2,3 …等,例如ttys1,ttys2,ttys23 …等等。它們類似於windows下的com1,com2等。

在linux中,串列埠等硬體元件被視為檔案,並在檔案系統的/ dev資料夾中組合在一起。如果導航到/ dev資料夾並使用ls命令列出檔案,則可以看到與各種硬體對應的檔案裝置。

輸入命令

dmesg|grep ttys
如果有

[ 37.531286] serial8250: ttys0 at i/o 0x3f8 (irq = 4) is a 16550a
則表示ttys0已連線

現在檢查任何usb轉串列埠轉換器使用dmesg | grep tty命令。

另乙個可以看到連線的序列裝置的地方是/ dev / serial / by-id資料夾。

要在linux下執行序列i/o,需要使用termios api。termios api支援兩種訪問串列埠的模式。即

* cannonical mode

* noncannonical mode

cannonical 模式是預設的模式,用於訪問終端等。我們用後面的一種模式

函式

open()開啟

close()關閉

open()系統呼叫需要兩個引數,要開啟的檔案的名稱(這裡串列埠),並與it.it相關的各種引數返回-1失敗和成功的正整數。

int fd;

fd = open( 「 / dev /ttyusb0 」,o_rdwr | o_noctty ) ;

o_rdwr :開啟埠進行讀寫操作

o_noctty :沒有終端控制開啟串列埠的程序

開啟串列埠後,應該使用close()系統呼叫關閉 .close()接受乙個引數,我們之前使用open()系統呼叫開啟串列埠的檔案描述符fd。就像close(fd)

c**

#include #include /* file control definitions          */

#include /* posix terminal control definitions*/

#include /* unix standard definitions */

#include /* error number definitions */

void main()

;

宣告結構體,並使用兩個函式配置它,tcgetattr() 和tcsetattr().tcsetattr()用於設定終端引數。函式在成功時返回0,失敗時為-1,並設定errnod的值。tcgetattr()用於將串列埠的當前設定獲取到我們剛剛宣告的結構。它有兩個引數,乙個是檔案描述符fd,對應於我們開啟的串列埠,另乙個是我們剛剛宣告的結構的位址。

tcgetattr(fd, &serialportsettings);
在得到當前的設定後,我們要改變它適合我們的需要。我們將配置串列埠以9600波特率傳輸,8位,無奇偶校驗,1個停止位,8-n-1配置。百科

波特率設定有兩個函式

1.cfsetispeed()用於設定讀或者輸入的波特率

2.cfsetospeed()用於設定輸出和寫的波特率

cfsetispeed(&serialportsettings,b9600);

cfsetospeed(&serialportsettings,b9600);

波特率的設定需要根據連線的硬體來設定。

termios結構的控制標誌(c_cflag)配置資料格式(資料的8位或7位)、奇偶校驗(偶數、奇數、none)和通訊時使用的啟動位和停止位的數量。配置這些資訊涉及設定和清除控制項標誌的各個位

如:

//校驗位設定

serialportsettings.c_cflag &= ~parenb; /*clear parity bit parenb*/

serialportsettings.c_cflag |= parenb; /*set parity bit parenb*/

//奇偶校驗位

serialportsettings.c_cflag &= ~parenb; // no parity

//設定停止位

serialportsettings.c_cflag &= ~cstopb; //stop bits = 1

//資料位8位

serialportsettings.c_cflag &= ~csize; /* clears the mask */

serialportsettings.c_cflag |= cs8; /* set the data bits = 8 */

關閉基於硬體的流控制(rts/cts)。

serialportsettings.c_cflag &= ~crtscts;
開啟串列埠(cread)的接收器,從串列埠讀取其他資料將不起作用。

serialportsettings.c_cflag |= cread | clocal;
關閉軟體流控制

serialportsettings.c_iflag &= ~(ixon | ixoff | ixany);
在設定操作方式時,linux中串列埠的預設操作方式是cannonical模式。對於與外部裝置的序列通訊,如序列數據機、滑鼠等。

serialportsettings.c_iflag &= ~(icanon | echo | echoe | isig);
有關上面討論的函式和常量的更多資訊,可以在termios手冊頁面中找到。

接下來我們可以使用tcsetattr()函式來設定它們。tcsetattr()接受三個引數,第乙個和最後乙個引數與tcgetattr()函式中相同。第二個引數optional_actions用於控制修改起作用的時間,而結構體termios_p中儲存了要修改的引數。optional_actions可以取如下的值。

tcsanow:不等資料傳輸完畢就立即改變屬性。

tcsadrain:等待所有資料傳輸結束才改變屬性。

tcsaflush:清空輸入輸出緩衝區才改變屬性。

我們不等資料傳輸完畢就立即改變屬性,即

tcsetattr(fd,tcsanow,&serialportsettings)
軟體設定就完成了,硬體連線後續……

linux串列埠程式設計

include 標準輸入輸出定義 include 標準函式庫定義 include unix標準函式定義 include include include 檔案控制定義 include ppsix終端控制定義 include 錯誤號定義 brief 設定串列埠通訊速率 param fd 型別 int 開...

Linux串列埠程式設計

串列埠概述 常見資料通訊方式 並行通訊,序列通訊 uart的主要操作 資料傳送及接受 產生中斷 產生波特率 loopback模式 紅外模式 自動流控模式 串列埠引數的配置主要包括 波特率 資料位 停止位 流控協議。linux中的串列埠裝置檔案放於 de 目錄下,串列埠一,串列埠二分別為 dev tt...

Linux串列埠程式設計

串列埠概述 常見資料通訊方式 並行通訊,序列通訊 uart的主要操作 資料傳送及接受 產生中斷 產生波特率 loopback模式 紅外模式 自動流控模式 串列埠引數的配置主要包括 波特率 資料位 停止位 流控協議。linux中的串列埠裝置檔案放於 de 目錄下,串列埠一,串列埠二分別為 dev tt...