在 linux 下串列埠檔案是位於 /dev 下的
開啟串列埠是通過使用標準的檔案開啟函式open操作:
#include #include #include #include #include #include #include #include static int fd;其中:o_nocttyint uart_open(int fd,const char *pathname)
return fd;
}
如果路徑名指向終端裝置,不要把這個裝置用作控制終端
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...