導讀
在嵌入式開發和物聯網應用中,Linux系統的串口通信至關重要。本文將簡單介紹Linux下串口設備的命名規則和termios結構體,并解析終端的三種工作模式,幫助開發者更好地掌握Linux串口編程。
Linux下串口設備名稱一般為"/dev/ttySn",n是數字,若串口是 USB 擴展的,則串口設備文件命名多為/dev/ttyUSBn。串口是一個終端設備,在Linux中用 termios結構體來描述:
struct termios { tcflag_t c_cflag; /* 控制標志 */ tcflag_t c_iflag; /* 輸入標志 */ tcflag_t c_oflag; /* 輸出標志 */ tcflag_t c_lflag; /* 本地標志 */ tcflag_t c_cc[NCCS]; /* 控制字符 */ };
termios是在POSIX規范中定義的標準接口,表示終端設備(包括虛擬終端,串口等)。終端有 3 種工作模式,分別為規范模式(canonical mode)、非規范模式(non-canonical mode)和原始模式(raw mode)。
c_lflag 中設置 ICANNON 標志來定義終端的三種模式:規范模式、非規范模式和原始模式。
1. 規范模式
規范模式下所有的輸入都是基于行進行處理的。在用戶輸入一個行結束符(回車符、EOF等)之前,系統調用read()函數讀不到用戶輸入的任何字符。除了EOF之外的行結束符(回車符等)和普通字符一樣都會被read()函數讀取到緩沖區之中。在規范模式中,行編輯是可行的,而且一次調用read()函數最多只能讀取一行數據。
2. 非規范模式
非規范模式所有的輸入是即時有效的,不需要用戶另外輸入行結束符,而且不可進行行編輯。在非規范模式下,對參數 MIN(c_cc[VMIN])和 TIME(c_cc[VTIME])的設置決定read()函數的調用方式。設置可以有 4 種不同的情況。
- VMIN=0和VTIME=0:read()函數立即返回。若有可讀數據,則讀取數據并返回被讀取的字節數,否則讀取失敗并返回0。
- VMIN >0和 VTIME =0:read()函數會被阻塞直到 VMIN 個字節數據可被讀取。
- VMIN =0和 VTIME >0:只要有數據可讀或者經過VTIME 個1/10秒的時間,read()函數則立即返回,返回值為被讀取的字節數。如果超時并且未讀到數據,則 read()函數返回0。
- VMIN >0和 VTIME >0:當有VMIN 個字節可讀或者兩個輸入字符之間的時間間隔超過VTIME個1/10秒時,read()函數才返回。因為在輸入第一個字符之后系統才會啟動定時器,所以在這種情況下,read()函數至少讀取一個字節之后才返回。
3. 原始模式
原始模式是一種特殊的非規范模式。在原始模式下,所有的輸入數據以字節為單位被處理。在這個模式下,終端是不可回顯的,而且所有特定的終端輸入/輸出控制處理不可用。通過調用 cfmakeraw()函數可以將終端設置為原始模式。
-
Linux系統
+關注
關注
4文章
596瀏覽量
27526 -
終端
+關注
關注
1文章
1159瀏覽量
30039 -
串口
+關注
關注
14文章
1560瀏覽量
77145
發布評論請先 登錄
相關推薦
labview串口通信的一些心得
labview串口通信的一些心得
CC2540ble 的串口通信總是會丟數,為什么?
關于串口的一些分享
LABVIEW讀取串口返回命令,字符丟失
求助!!LABVIEW讀取串口返回命令,字符丟失
GD32F310開發板串口的一些特殊功能介紹
CH582如果打印一些特殊功能按鍵應該怎么修改呢?
淺析串口通信的一些基本概念及常見問題
STM32中遇到的問題--關于串口的一些常見問題
![STM32中遇到的問題--關于<b class='flag-5'>串口</b>的<b class='flag-5'>一些</b>常見問題](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論