Linux下接收串列埠資料0x0d變0X0a問題

2021-10-09 07:47:07 字數 3816 閱讀 7842

許多流行的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...