1. 程式人生 > >linux串列埠接收不到0x11解決

linux串列埠接收不到0x11解決

問題

網上許多流行的linux串列埠 程式設計的版本中都沒對c_iflag(termios成員變數)這個變數進行有效的設定,這樣傳送ASCII碼時沒什麼問題,但傳送二進位制資料時遇到0x0d,0x11和0x13卻會被丟掉。不用說也知道,這幾個肯定是特殊字元,被用作特殊控制了。關掉ICRNL和IXON選項即可解決。

解決方法

c_iflag &= ~(ICRNL | IXON);

0x0d 回車符CR

0x11 ^Q VSTART字元

0x13 ^S VSTOP字元

ICRNL 將輸入的CR轉換為NL  

IXON 使起動/停止輸出控制流起作用

在《UNIX環境高階程式設計第二版》第18章第11小節看到把終端I/O設定為原始模式(串列埠通訊就是終端I/O的原始模式)時輸入屬性設定為

term.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);

遮蔽了許多屬性,怪不得有人說如果是使用串列埠通訊c_iflag和c_oflag都設定為0就行了!

參考設定:

以下是我的設定的一些重要的串列埠屬性

term.c_cflag |= CLOCAL | CREAD;

term.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);

term.c_oflag &= ~OPOST;

term.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);

參考文章: