linux下串列埠使用

2021-09-26 18:34:22 字數 3487 閱讀 7117

串列埠終端程式設計順序

開啟->設定->讀寫->關閉。

涉及到的api。

(1)、獲取終端屬性tcgetattr()

原型:int tcgetattr(int fd,struct termios *termios_p);

功能:取得終端介質(fd)初始值,並把其值賦給temios_p;函式可以從後台程序中呼叫;但是,終端屬性可能被後來的前台程序所改變。

(2)、struct termios結構體的配置。

struct termios options;

設定波特率

cfsetispeed(&options,b9600);

cfsetospeed(&options,b9600);

設定資料位數:

options.c_cflag &= ~csize;//遮蔽其它標誌位

options.c_cflag |= cs8;

options.c_cflag &= ~cstopb;//cstopb:使用1位停止位

(3) 回寫終端屬性tcsetattr() ,通過引數是否為const的指標可以判斷是出參還是入參。

原型:int tcsetattr(int fd,int actions,const struct termios *termios_p);

功能:設定與終端相關的引數 (除非需要底層支援卻無法滿足),使用termios_p 引用的termios 結構。optional_actions(tcsetattr函式的第二個引數)指定了什麼時候改變會起作用:

tcsanow:改變立即發生

tcsadrain:改變在所有寫入fd 的輸出都被傳輸後生效。這個函式應當用於修改影響輸出的引數時使用。(當前輸出完成時將值改變)

tcsaflush :改變在所有寫入fd 引用的物件的輸出都被傳輸後生效,所有已接受但未讀入的輸入都在改變發生前丟棄(同tcsadrain,但會捨棄當前所有值)。

1、標頭檔案:

#include

#include

#include

#include

#include

#include

#include

#include

2、開啟串列埠裝置檔案

static

int fd;

intuart_open

(int fd,

const

char

*pathname)

return fd;

}

3、設定串列埠

串列埠初始化需要設定串列埠波特率,資料流控制,幀的格式(即資料位個數,停止位,校驗位,資料流控制)。

最基本的串列埠設定包括波特率、校驗位和停止位設定,且串列埠設定主要使用

termios.h標頭檔案中定義的termios結構

串列埠配置函式

int

uart_set

(int fd,

int baude,

int c_flow,

int bits,

char parity,

int stop)

/*設定輸入輸出波特率,兩者保持一致*/

switch

(baude)

/*設定控制模式*/

options.c_cflag |

= clocal;

//保證程式不占用串列埠

options.c_cflag |

= cread;

//保證程式可以從串列埠中讀取資料

/*設定資料流控制*/

switch

(c_flow)

/*設定資料位*/

switch

(bits)

/*設定校驗位*/

switch

(parity)

/*設定停止位*/

switch

(stop)

/*設定輸出模式為原始輸出*/

options.c_oflag &

=~opost;

/*設定本地模式為原始模式*/

options.c_lflag &=~

(icanon | echo | echoe | isig);/*

*icanon:允許規範模式進行輸入處理

*echo:允許輸入字元的本地回顯

*echoe:在接收epase時執行backspace,space,backspace組合

*isig:允許訊號

*//*設定等待時間和最小接受字元 否則就會阻塞 如果兩個都是0就表示只要我去讀就會返回*/

options.c_cc[vtime]=0

;//可以在select中設定

options.c_cc[vmin]=1

;//最少讀取乙個字元

/*如果發生資料溢位,只接受資料,但是不進行讀操作*/

tcflush

(fd,tciflush);/*

啟用配置

tcsanow:立即執行而不等待資料傳送或者接受完成。

tcsadrain:等待所有資料傳遞完成後執行。

tcsaflush:flush input and output buffers and make the change

*/if

(tcsetattr

(fd,tcsanow,

&options)

<0)

return0;

}

串列埠預設緩衝512個位元組

4、串列埠讀寫

ssize_t safe_write

(int fd,

const

void

*vptr, size_t n)

nleft -

= nwritten;

ptr +

= nwritten;

}return

(n);

}ssize_t safe_read

(int fd,

void

*vptr,size_t n)

else

if(nread ==0)

break

; nleft -

= nread;

ptr +

= nread;

}return

(n-nleft);}

intuart_read

(int fd,

char

*r_buf,size_t len)

return cnt;}}

intuart_write

(int fd,

const

char

*w_buf,size_t len)

return cnt;

}

5、關閉串列埠

int

uart_close

(int fd)

Linux下串列埠通訊

1.開啟串列埠 與其他的關於裝置程式設計的方法一樣,在linux下,操作 控制串列埠也是通過操作起裝置檔案進行的。在linux下,串列埠的裝置檔案是 dev ttys0或 dev ttys1等。因此要讀寫串列埠,我們首先要開啟串列埠 char dev dev ttys0 串列埠1 int fd op...

Linux下串列埠工具

gunzip cku211.tar.gz tar xvf cku211.tar rm rf cku211.tar make linux mv wermit usr local bin kermit 執行以上命令,就可以在終端上輸入kermit就可執行了。2.kermit指令碼設定 vi kermrc...

Linux下串列埠程式設計

linux下串列埠程式設計 linux 系統下,諸如串列埠 觸控螢幕 gpio adc 等等各種裝置的操作,都是 通過訪問其對應的裝置節點進行控制。相應地,串列埠通過訪問 dev ttys0 dev ttys1 dev ttys2.對其進行配置與控制。串列埠配置的引數包括 波特率,資料位,校驗位,停...