Linux下串列埠程式設計入門

2021-09-06 23:06:16 字數 3056 閱讀 8871

簡介:

linux作業系統從一開始就對序列口提供了很好的支援,本文就linux下的序列口通訊程式設計進行簡單的介紹。

串列埠簡介

序列口是計算機一種常用的介面,具有連線線少,通訊簡單,得到廣泛的使用。常用的串列埠是rs-232-c介面(又稱eia rs-232-c)它是在2023年由美國電子工業協會(eia)聯合貝爾系統、數據機廠家及計算機終端生產廠家共同制定的用於序列通訊的標準。它的全名是"資料終端裝置(dte)和資料通訊裝置(dce)之間序列二進位制資料交換接**術標準"該標準規定採用乙個25個腳的db25聯結器,對聯結器的每個引腳的訊號內容加以規定,還對各種訊號的電平加以規定。傳輸距離在碼元畸變小於4%的情況下,傳輸電纜長度應為50英呎。

linux作業系統從一開始就對序列口提供了很好的支援,本文就linux下的序列口通訊程式設計進行簡單的介紹,如果要非常深入了解,建議看看本文所參考的《serial programming guide for posix operating systems》

串列埠操作

串列埠操作需要的標頭檔案

#include /*標準輸入輸出定義*/

#include /*標準函式庫定義*/

#include /*unix 標準函式定義*/

#include

#include

#include /*檔案控制定義*/

#include /*ppsix 終端控制定義*/

#include /*錯誤號定義*/

開啟串列埠

在 linux 下串列埠檔案是位於 /dev 下的。串列埠一 為 /dev/ttys0,串列埠二 為 /dev/ttys1。開啟串列埠是通過使用標準的檔案開啟函式操作:

int fd; /*以讀寫方式開啟串列埠*/

fd = open( "/dev/ttys0", o_rdwr);

if (-1 == fd)

設定串列埠

最基本的設定串列埠包括波特率設定,效驗位和停止位設定。串列埠的設定主要是設定 struct termios結構體的各成員值。

struct termio;

設定這個結構體很複雜,我這裡就只說說常見的一些設定:

波特率設定下面是修改波特率的**:

struct termios opt;

tcgetattr(fd, &opt);

cfsetispeed(&opt,b19200); /*設定為19200bps*/ cfsetospeed(&opt,b19200);

tcsetattr(fd,tcanow,&opt);

設定波特率的例子函式:

int speed_arr = ;

int name_arr = ;

void set_speed(int fd, int speed)

tcflush(fd,tcioflush);}}

} 設定效驗的函式:

int set_parity(int fd,int databits,int stopbits,int parity)

options.c_cflag &= ~csize;

switch (databits) /*設定資料位數*/

switch (parity)

/* 設定停止位*/

switch (stopbits)

/* set input parity option */

if (parity != 'n')

options.c_iflag |= inpck;

tcflush(fd,tciflush);

options.c_cc[vtime] = 150; /* 設定超時15 seconds*/

options.c_cc[vmin] = 0; /* update the options and do it now */

if (tcsetattr(fd,tcsanow,&options) != 0)

return (true);}

需要注意的是:如果不是開發終端之類的,只是串列埠傳輸資料,而不需要串列埠來處理,那麼使用原始模式(raw mode)方式來通訊,設定方式如下:

options.c_lflag &= ~(icanon | echo | echoe | isig); /*input*/

options.c_oflag &= ~opost; /*output*/

讀寫串列埠

設定好串列埠之後,讀寫串列埠就很容易了,把串列埠當作檔案讀寫就是。

char buffer[1024];

int length;

int nbyte;

nbyte = write(fd, buffer ,length)

·讀取串列埠資料

使用檔案操作read函式讀取,如果設定為原始模式(raw mode)傳輸資料,那麼read函式返回的字元數是實際串列埠收到的字元數。可以使用操作檔案的函式來實現非同步讀取,如fcntl,或者select等來操作。

char buff[1024];

int len;

int readbyte = read(fd,buff,len);

關閉串列埠

關閉串列埠就是關閉檔案。

close(fd);

例子

下面是乙個簡單的讀取串列埠資料的例子,使用了上面定義的一些函式和標頭檔案

#define false  -1

#define true   0

int opendev(char *dev)

else 

return fd;

}int main(int argc, char **argv)

while (1)

}close(fd);}

參考資料

serial programming guide for posix operating systems

Linux串列埠程式設計入門

fedora12 gcc 4.4.4 linux的串列埠程式設計使用posix終端控制函式,關於posix終端控制函式的詳細情況可以檢視 serial programming guide for posix operating systems 我的翻譯 posix作業系統的串列埠程式設計指南 ter...

Linux下串列埠入門

簡介 linux作業系統從一開始就對序列口提供了很好的支援,本文就linux下的序列口通訊程式設計進行簡單的介紹。串列埠簡介 序列口是計算機一種常用的介面,具有連線線少,通訊簡單,得到廣泛的使用。常用的串列埠是rs 232 c介面 又稱eia rs 232 c 它是在1970年由美國電子工業協會 e...

Linux下串列埠程式設計

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