導(dǎo)讀
在嵌入式開發(fā)和物聯(lián)網(wǎng)應(yīng)用中,Linux系統(tǒng)的串口通信至關(guān)重要。本文將簡單介紹Linux下串口設(shè)備的命名規(guī)則和termios結(jié)構(gòu)體,并解析終端的三種工作模式,幫助開發(fā)者更好地掌握Linux串口編程。
Linux下串口設(shè)備名稱一般為"/dev/ttySn",n是數(shù)字,若串口是 USB 擴(kuò)展的,則串口設(shè)備文件命名多為/dev/ttyUSBn。串口是一個(gè)終端設(shè)備,在Linux中用 termios結(jié)構(gòu)體來描述:
struct termios { tcflag_t c_cflag; /* 控制標(biāo)志 */ tcflag_t c_iflag; /* 輸入標(biāo)志 */ tcflag_t c_oflag; /* 輸出標(biāo)志 */ tcflag_t c_lflag; /* 本地標(biāo)志 */ tcflag_t c_cc[NCCS]; /* 控制字符 */ };
termios是在POSIX規(guī)范中定義的標(biāo)準(zhǔn)接口,表示終端設(shè)備(包括虛擬終端,串口等)。終端有 3 種工作模式,分別為規(guī)范模式(canonical mode)、非規(guī)范模式(non-canonical mode)和原始模式(raw mode)。
c_lflag 中設(shè)置 ICANNON 標(biāo)志來定義終端的三種模式:規(guī)范模式、非規(guī)范模式和原始模式。
1. 規(guī)范模式
規(guī)范模式下所有的輸入都是基于行進(jìn)行處理的。在用戶輸入一個(gè)行結(jié)束符(回車符、EOF等)之前,系統(tǒng)調(diào)用read()函數(shù)讀不到用戶輸入的任何字符。除了EOF之外的行結(jié)束符(回車符等)和普通字符一樣都會(huì)被read()函數(shù)讀取到緩沖區(qū)之中。在規(guī)范模式中,行編輯是可行的,而且一次調(diào)用read()函數(shù)最多只能讀取一行數(shù)據(jù)。
2. 非規(guī)范模式
非規(guī)范模式所有的輸入是即時(shí)有效的,不需要用戶另外輸入行結(jié)束符,而且不可進(jìn)行行編輯。在非規(guī)范模式下,對(duì)參數(shù) MIN(c_cc[VMIN])和 TIME(c_cc[VTIME])的設(shè)置決定read()函數(shù)的調(diào)用方式。設(shè)置可以有 4 種不同的情況。
- VMIN=0和VTIME=0:read()函數(shù)立即返回。若有可讀數(shù)據(jù),則讀取數(shù)據(jù)并返回被讀取的字節(jié)數(shù),否則讀取失敗并返回0。
- VMIN >0和 VTIME =0:read()函數(shù)會(huì)被阻塞直到 VMIN 個(gè)字節(jié)數(shù)據(jù)可被讀取。
- VMIN =0和 VTIME >0:只要有數(shù)據(jù)可讀或者經(jīng)過VTIME 個(gè)1/10秒的時(shí)間,read()函數(shù)則立即返回,返回值為被讀取的字節(jié)數(shù)。如果超時(shí)并且未讀到數(shù)據(jù),則 read()函數(shù)返回0。
- VMIN >0和 VTIME >0:當(dāng)有VMIN 個(gè)字節(jié)可讀或者兩個(gè)輸入字符之間的時(shí)間間隔超過VTIME個(gè)1/10秒時(shí),read()函數(shù)才返回。因?yàn)樵谳斎氲谝粋€(gè)字符之后系統(tǒng)才會(huì)啟動(dòng)定時(shí)器,所以在這種情況下,read()函數(shù)至少讀取一個(gè)字節(jié)之后才返回。
3. 原始模式
原始模式是一種特殊的非規(guī)范模式。在原始模式下,所有的輸入數(shù)據(jù)以字節(jié)為單位被處理。在這個(gè)模式下,終端是不可回顯的,而且所有特定的終端輸入/輸出控制處理不可用。通過調(diào)用 cfmakeraw()函數(shù)可以將終端設(shè)置為原始模式。
-
Linux系統(tǒng)
+關(guān)注
關(guān)注
4文章
596瀏覽量
27510 -
終端
+關(guān)注
關(guān)注
1文章
1156瀏覽量
30006 -
串口
+關(guān)注
關(guān)注
14文章
1558瀏覽量
77056
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論