許多流行的linux串列埠程式設計的版本中都沒對c_iflag(termios成員變數)這個變數進行有效的設定,這樣傳送ascii碼時沒什麼問題,但傳送二進位制資料時遇到0x0d,0x11和0x13卻會被丟掉。不用說也知道,這幾個肯定是特殊字元,被用作特殊控制了。關掉icrnl和ixon選項即可解決:
c_iflag &
= ~(icrnl | ixon)
;0x0d 回車符cr
0x11 ^q vstart字元
0x13 ^s vstop字元
i crnl 將輸入的cr轉換為nl
ixon 使起動/停止輸出控制流起作用
在《unix環境高階程式設計第二版》第18章第11小節看到把終端i/o設定為原始模式(串列埠通訊就是終端i/o的原始模式)時輸入屬性設定為
term.c_iflag &
= ~(brkint | icrnl | inpck | istrip | ixon)
;
tcgetattr是乙個函式,成功返回零;失敗返回非零,發生失敗介面將設定 errno錯誤標識。
標頭檔案:
#include
函式原型:int
tcgetattr
(int fd,
struct termios *termios_p)
;tcsetattr函式用於設定終端的相關引數。引數fd為開啟的終端 檔案描述符,引數optional_actions用於控制修改起作用的時間,而結構體termios_p中儲存了要修改的引數。
optional_actions可以取如下的值:
tcsanow:不等資料傳輸完畢就立即改變屬性。
tcsadrain:等待所有資料傳輸結束才改變屬性。
tcsaflush:清空輸入輸出緩衝區才改變屬性。
錯誤資訊:
ebadf:非法的 檔案描述符。
eintr:tcsetattr 函式呼叫被訊號中斷。
einval:引數optional_actions使用了非法值,或引數 termios中使用了非法值。
enctty:非終端的檔案描述符。
說明:
tcgetattr函式用於獲取與終端相關的引數。引數fd為終端的 檔案描述符,返回的結果儲存在 termios
結構體中,該結構體一般包括如下的成員:
tcflag_t c_iflag;
tcflag_t c_oflag;
tcflag_t c_cflag;
tcflag_t c_lflag;
cc_t c_cc[nccs]
;
其具體意義如下:
c_iflag:輸入模式標誌,控制終端輸入方式,具體引數如下表所示:
鍵 值說 明
ignbrk
忽略break鍵輸入
brkint
如果設定了ignbrk,break鍵輸入將被忽略
ignpar
忽略 奇偶校驗錯誤
parmrk
標識奇偶校驗錯誤
inpck
允許輸入 奇偶校驗
istrip
去除字元的第8個位元
inlcr
將輸入的nl(換行)轉換成cr(回車)
igncr
忽略輸入的回車
icrnl
將輸入的回車轉化成換行(如果igncr未設定的情況下)
iuclc
將輸入的大寫字元轉換成小寫字元(非 posix)
ixon
允許輸出時對 xon/xoff流進行控制
ixany
輸入任何字元將重啟停止的輸出
ixoff
允許輸入時對 xon/xoff流進行控制
imaxbel
當輸入佇列滿的時候開始響鈴
c_oflag:輸出模式標誌,控制終端輸出方式,具體引數如下表所示:
鍵 值說 明
opost
處理後輸出
olcuc
將輸出的小寫字元轉換成大寫字元(非 posix)
onlcr
將輸出的nl(換行)轉換成cr(回車)及nl(換行)
ocrnl
將輸出的cr(回車)轉換成nl(換行)
onocr
第一行不輸出回車符
onlret
不輸出回車符
ofill
傳送填充字元以延遲終端輸出
ofdel
以 ascii碼的del作為填充字元,如果未設定該引數,填充字元為nul
nldly
換行輸出延時,可以取nl0(不延遲)或nl1(延遲0.1s)
crdly
回車延遲,取值範圍為:cr0、cr1、cr2和 cr3
tabdly
水平 製表符輸出延遲,取值範圍為:tab0、tab1、tab2和tab3
bsdly
空格輸出延遲,可以取bs0或bs1
vtdly
垂直製表符輸出延遲,可以取vt0或vt1
ffdly
換頁延遲,可以取ff0或ff1
c_cflag:控制模式標誌,指定終端硬體控制資訊,具體引數如下表所示:
鍵 值說 明
cbaud
波特率(4+1位)(非 posix)
cbaudex
附加波特率(1位)(非posix)
csize
字元長度,取值範圍為cs5、cs6、cs7或cs8
cstopb
設定兩個停止位
cread
使用接收器
parenb
使用 奇偶校驗
parodd
對輸入使用奇偶校驗,對輸出使用 偶校驗
hupcl
關閉裝置時掛起
clocal
忽略數據機線路狀態
crtscts
使用rts/cts 流控制
鍵 值說 明
isig
當輸入intr、quit、susp或dsusp時,產生相應的訊號
icanon
使用標準輸入模式
xcase
在icanon和xcase同時設定的情況下,終端只使用大寫。
echo
顯示輸入字元
echoe
如果icanon同時設定, erase將刪除輸入的字元
echok
如果icanon同時設定,kill將刪除當前行
echonl
如果icanon同時設定,即使echo沒有設定依然顯示 換行符
echoprt
如果echo和icanon同時設定,將刪除列印出的字元(非 posix)
tostop
向後台輸出傳送sigttou訊號
c_cc[nccs]: 控制字元,用於儲存終端驅動程式中的 特殊字元,如輸入結束符等。c_cc中定義了如下表所示的控制字元:
巨集說 明
巨集說 明
vintr
interrupt字元
veol
附加的end-of-file字元
vquit
quit字元
vtime
非規範模式讀取時的超時時間
verase
erase字元
vstop
stop字元
vkill
kill字元
vstart
start字元
veof
end-of-file字元
vsusp
suspend字元
vmin
非規範模式讀取時的最小字元數
資料結構複習 0x0 基礎
邏輯結構與物理結構 邏輯結構 集合結構 線性結構 樹形結構 圖形結構 物理結構 順序儲存結構 鏈式儲存結構 資料型別 一組性質相同的值的集合及定義在此集合上的一些操作的總稱。抽象資料型別 adt,abstract data type 是指乙個數學模型及定義在該模型上的一組操作。演算法 解決特定問題求...
linux串列埠接收不到0x11解決
linux串列埠接收不到0x11解決 網上許多流行的linux串列埠 程式設計的版本中都沒對c iflag termios成員變數 這個變數進行有效的設定,這樣傳送ascii碼時沒什麼問題,但傳送二進位制資料時遇到0x0d,0x11和0x13卻會被丟掉。不用說也知道,這幾個肯定是特殊字元,被用作特殊...
2019網路工作室暑假留校學習筆記0x01
目錄結構 cj 倉庫名稱 姓名首字母 0709 日期 readme.md 筆記 code 長段 短的可以直接寫到markdown裡 img 資源 0710 readme.md code img 0711 readme.md code img學習linux基本操作 推薦ubuntu 命令基本格式 cm...