Linux 下串列埠程式設計 程式設計實現

2021-09-14 03:37:34 字數 3932 閱讀 7708

在 linux 下串列埠檔案是位於 /dev 下的

開啟串列埠是通過使用標準的檔案開啟函式open操作:

#include     #include     #include     #include     #include     #include     #include     #include     static int fd;

int uart_open(int fd,const char *pathname)

return fd;

}

其中:o_noctty

如果路徑名指向終端裝置,不要把這個裝置用作控制終端

o_nonblock

如果路徑名指向 fifo/塊檔案/字元檔案,則把檔案的開啟和後繼 i/o設定為非阻塞模式(nonblocking mode)

對於串列埠的開啟操作,必須使用o_noctty引數,它表示開啟的是乙個終端裝置,程式不會成為該埠的控制終端。如果不使用此標誌,任務的乙個輸入都會影響程序。如鍵盤上過來的ctrl+c中止訊號等都將影響程序。

回到目錄

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

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_lflag &= ~(icanon | echo | echoe | isig);

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

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

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

*isig:允許訊號

*//*設定等待時間和最小接受字元*/

options.c_cc[vtime] = 0;//可以在select中設定

options.c_cc[vmin] = 1;//最少讀取乙個字元

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

tcflush(fd,tciflush);

/*啟用配置*/

if(tcsetattr(fd,tcsanow,&options) < 0)

return 0;

}

回到目錄

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);

}int uart_read(int fd,char *r_buf,size_t len)

return cnt;

}}int uart_write(int fd,const char *w_buf,size_t len)

return cnt;

}

回到目錄

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

int uart_close(int fd)

回到目錄

#include#include#include#include#include#include#include#include#include#includestatic int ret;

static int fd;

/* * 安全讀寫函式

*/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);

}int uart_open(int fd,const char *pathname)

/*清除串列埠非阻塞標誌*/

if(fcntl(fd,f_setfl,0) < 0)

return fd;

}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_lflag &= ~(icanon | echo | echoe | isig);

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

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

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

*isig:允許訊號

*//*設定等待時間和最小接受字元*/

options.c_cc[vtime] = 0;//可以在select中設定

options.c_cc[vmin] = 1;//最少讀取乙個字元

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

tcflush(fd,tciflush);

/*啟用配置*/

if(tcsetattr(fd,tcsanow,&options) < 0)

return 0;

}int uart_read(int fd,char *r_buf,size_t len)

return cnt;

}}int uart_write(int fd,const char *w_buf,size_t len)

return cnt;

}int uart_close(int fd)

int main(void)

if(uart_set(fd,9600,0,8,'n',1) == -1)

ret = uart_write(fd,w_buf,w_len);

if(ret == -1)

while(1)

}ret = uart_close(fd);

if(ret == -1)

exit(exit_success);

}

Linux下串列埠程式設計

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

Linux 下串列埠通訊程式設計

int open com char device name return fd end of open com 一 串列埠程式需要的標頭檔案 include 標準輸入輸出定義 include 標準函式庫定義 include unix標準函式定義 include include include 檔案控...

Linux下串列埠程式設計入門

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