簡介:
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.對其進行配置與控制。串列埠配置的引數包括 波特率,資料位,校驗位,停...