最近在做乙個gps專案,第一部分是將開發板和gps用串列埠通訊,接受gps上傳來的資料。
linux下所有的裝置都是以檔案形式儲存的,串列埠也是。
整個串列埠通訊的流程圖為:
所用到的標頭檔案為:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include用到了兩個全域性變數:
staticintfd;
static所需要的函式為:intret;
intuart_open(int
fd,const
char
*pathname);
intuart_config(int
fd,int
baude,int
c_flow,
intbits,
char
parity,
intstop);
intsafe_read(int
fd,char
*vptr,
size_t
len);
intuart_read(int
fd,char
*r_buf,
size_t
lenth);//串列埠讀取資料
int開啟串列埠:uart_close(int
fd);
intuart_open()
if(fcntl(fd,f_setfl,0)<0)//設定串列埠非阻塞,因為這裡是以非阻塞形式開啟的,所以第三個引數為0,後面會詳細介紹fcntl函式
returnfd;
}配置串列埠:
配置串列埠非常重要,這裡我做了乙個配置串列埠函式的流程圖
配置串列埠,就是設給termios結構體內的資料賦值,下面科普一下termios結構體
串列埠配置的函式**:最小的termios結構體如下:
struct termios
輸入模式和輸出模式都比較好理解,這裡介紹一下控制模式和本地模式
控制模式:主要用於控制終端裝置的硬體設定。如:波特率,奇偶校驗位,資料位,停止位,資料流控制等。
本地模式:主要用來控制終端裝置不同的特色。如:回顯的各種方式,是否允許特殊字元,禁止重新整理等。
c_cc陣列:特殊控制字元可提供使用者設定一些特殊的功能。
比如這裡我們用到的c_cc[vtime]設定等待時間,c_cc[vmin]設定最小接受字元
用到的有關termios的函式:
int tcgetattr(int fd, struct termios &termios_p);//用於獲取termios結構體屬性。成功返回0,失敗返回非0
int tcsetattr(int fd, int actions, const struct termios *termios_p);//用於啟用termios結構體配置
int fcntl(int fd, int cmd, long arg);//用來操作檔案描述詞的一些特性
返回值:成功返回0,失敗返回-1,失敗原因存入errno
cmd有許多引數,可參考c函式庫,這裡用到的f_setfl是設定檔案描述詞狀態旗標,引數arg為新旗標
int tcflush(int fd, int queue_selector);//用於清空輸入、輸出緩衝區
//queue_selector有三種取值 tciflush(用於清空輸入緩衝區) tcoflush(用於清空輸出緩衝區) tcioflush(用於清空輸入輸出緩衝區)
intuart_config(int
fd,int
baude,int
c_flow,
intbits,
char
parity,
intstop);
intuart_config(int
fd,int
baude,int
c_flow,
intbits,
char
parity,
intstop)
switch(baude)
switch(c_flow)
switch(bits)
switch(parity)
switch(stop)
uart.c_oflag&=~opost;//opost:表示資料經過處理後輸出
if(tcsetattr(fd,tcsanow,&uart)<0)//啟用配置,失敗返回-1
uart.c_lflag&=~(icanon|echo|echoe|isig);//使串列埠工作在原始模式下
uart.c_cc[vtime]=0;//設定等待時間為0
uart.c_cc[vmin]=1;//設定最小接受字元為1
tcflush(fd,tciflush);//清空輸入緩衝區
if(tcsetattr(fd,tcsanow,&uart)<0)//啟用配置
return0;
}接下來是安全讀(防止記憶體溢位)
**如下:
intsafe_read(int
fd,char
*vptr,
size_t
len)
elseif(nread==
0)
}
left-=nread;//read成功後,剩餘要讀取的位元組自減
ptr+=nread;//指標向後移,避免後讀到的字元覆蓋先讀到的字元
}
return(len-left);
}然後是串列埠的讀,這裡主要是設定多路i/o,用到select函式
intuart_read(int
fd,char
*r_buf,
size_t
lenth);
intuart_read(int
fd,char
*r_buf,
size_t
lenth)
returncnt;
}
}最後乙個函式是串列埠的關閉
intuart_close(int
fd);
int最後是main函式uart_close(int
fd)
實驗成功
樹莓派 Linux 下的串列埠通訊 (C語言)
執行環境 ubuntu14.04 樹莓派3b 功能 實現串列埠資料的收發 main.c檔案 include com.h define buffer size 30 最大快取區 char pstr int main int argc,char argv 傳送資料 dowhile read buffer...
Linux下串列埠通訊
1.開啟串列埠 與其他的關於裝置程式設計的方法一樣,在linux下,操作 控制串列埠也是通過操作起裝置檔案進行的。在linux下,串列埠的裝置檔案是 dev ttys0或 dev ttys1等。因此要讀寫串列埠,我們首先要開啟串列埠 char dev dev ttys0 串列埠1 int fd op...
linux 下串列埠通訊
include include include include include include include include include define baudrate b115200 baud rate 115200 define device dev ttyama0 define size...