Linux 串列埠程式設計 使用termios與API進行串列埠程式開發

SoldierJazz2019發表於2017-05-19

在 termios 結構體以及內部終端控制標誌中,並非所有的引數對於實際的物理串列埠都是有效的,在使用過程中也不需要對於所有標誌的作用都有所理解。事實上,快速掌握一項技術的核心點也是一種學習能力。對於使用,熟悉並掌握操作框架十分有用。對於串列埠程式設計,核心步驟也十分鮮明,下面首先介紹 termios 相關的 API 函式。

核心配置函式

1. int tcgetattr(int fd, struct termios *termios_p);

函式功能:獲取當前終端介面配置並將配置寫入引數 termios_p 指向的 termios 結構體。一般操作時將配置儲存為 old_termios,可以在需要時通過 tcsetattr 函式對終端介面進行重新配置。

2. int tcsetattr(int fd, int actions, const struct termios *termios_p);

函式功能:使用 termios_p 指向的 termios 結構體對終端介面進行配置,引數 actions 控制修改方式,共有3種修改方式,如下所示:

  • TCSANOW:立刻對配置進行修改。
  • TCSADRAIN:等當前輸出完成後再對配置進行修改。
  • TCSAFLUSH:等當前輸出完成後再對配置進行修改,但丟棄還未從 read 呼叫返回的當前可用的任何輸入。
Note:如果需要在程式操作結束恢復終端或者串列埠的初始狀態,那麼就需要使用 tcgetattr 介紹中的操作步驟進行恢復。

終端速度函式

1.speed_t cfgetispeed(const struct termios *);

函式功能:獲取終端讀取速度。

2.speed_t cfgetospeed(const struct termios *);

函式功能:獲取終端輸出速度。

3.int cfsetispeed(const struct termios *, speed_t speed);

函式功能:設定終端讀取速度。

4.int cfgetispeed(const struct termios *, speed_t speed);

函式功能:設定終端輸出速度。

Note:輸入與輸出速度是分開控制的;根據函式形參,這些函式只作用於 termios 結構,而不是直接作用於裝置。因此如果要設定速度,就要首先使用 tcgetattr 獲取當前終端配置,然後使用上述函式設定速度,最後使用 tcsetattr 將 termios 配置寫入裝置。此外,還要注意系統支援的波特率範圍,通過檢視 termios.h 可以獲取到。

其他控制函式

1.int tcdrain(int fd);

函式功能:讓呼叫程式一直等待,直到所有排隊的輸出都已傳送完畢。

2.int tcflow(int fd, int flowtype);

函式功能:用於暫停或重新開始輸出。

3.int tcflush(int fd, int in_out_selector);

函式功能:用於清空輸入、輸出或者兩者同時清空。

Note:如果串列埠程式發生阻塞,檢查程式中是否呼叫了上述 API。在開啟終端或者串列埠裝置之前,對應的輸入或者待輸出資料快取在驅動程式中,因此要根據實際需求選擇是否呼叫 tcflush 清空相應緩衝區資料。

關於終端串列埠 API 函式的講解本篇就到這裡,在實際應用開發中必須明確程式中配置的標誌位和函式的作用,在不確定作用的情況下最好保持預設設定。

關於 Linux 串列埠程式設計的其他文章,可以移步至以下連結:

  1. 《Linux 串列埠程式設計<一> 一些背景》
  2. 《Linux 串列埠程式設計<二> 深入瞭解 termios》
  3. 《Linux 串列埠程式設計<三> 使用termios與API 進行串列埠程式開發》
  4. 《Linux 串列埠程式設計<四> 串列埠裝置程式開發》

有想法或者疑問可以給我郵件或者評論,覺得本文對你有幫助就點贊吧~:-D





相關文章