Linux下C語言串列埠通訊

2021-08-18 16:35:55 字數 4904 閱讀 3242

最近在做乙個gps專案,第一部分是將開發板和gps用串列埠通訊,接受gps上傳來的資料。

linux下所有的裝置都是以檔案形式儲存的,串列埠也是。

整個串列埠通訊的流程圖為:

所用到的標頭檔案為:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

用到了兩個全域性變數:

static

intfd;

static

intret;

所需要的函式為:

int

uart_open(int

fd,const

char

*pathname);

int

uart_config(int

fd,int

baude,int

c_flow,

intbits,

char

parity,

intstop);

int

safe_read(int

fd,char

*vptr,

size_t

len);

int

uart_read(int

fd,char

*r_buf,

size_t

lenth);//串列埠讀取資料

int

uart_close(int

fd);

開啟串列埠:

int

uart_open()

if(fcntl(fd,f_setfl,0)<0)//設定串列埠非阻塞,因為這裡是以非阻塞形式開啟的,所以第三個引數為0,後面會詳細介紹fcntl函式

return

fd;

}
配置串列埠:

配置串列埠非常重要,這裡我做了乙個配置串列埠函式的流程圖

配置串列埠,就是設給termios結構體內的資料賦值,下面科普一下termios結構體

最小的termios結構體如下:struct termios輸入模式和輸出模式都比較好理解,這裡介紹一下控制模式和本地模式控制模式:主要用於控制終端裝置的硬體設定。如:波特率,奇偶校驗位,資料位,停止位,資料流控制等。本地模式:主要用來控制終端裝置不同的特色。如:回顯的各種方式,是否允許特殊字元,禁止重新整理等。c_cc陣列:特殊控制字元可提供使用者設定一些特殊的功能。比如這裡我們用到的c_cc[vtime]設定等待時間,c_cc[vmin]設定最小接受字元用到的有關termios的函式:int tcgetattr(int fd, struct termios &termios_p);//用於獲取termios結構體屬性。成功返回0,失敗返回非0int tcsetattr(int fd, int actions, const struct termios *termios_p);//用於啟用termios結構體配置int fcntl(int fd, int cmd, long arg);//用來操作檔案描述詞的一些特性返回值:成功返回0,失敗返回-1,失敗原因存入errnocmd有許多引數,可參考c函式庫,這裡用到的f_setfl是設定檔案描述詞狀態旗標,引數arg為新旗標int tcflush(int fd, int queue_selector);//用於清空輸入、輸出緩衝區//queue_selector有三種取值  tciflush(用於清空輸入緩衝區) tcoflush(用於清空輸出緩衝區) tcioflush(用於清空輸入輸出緩衝區)
串列埠配置的函式**:

int

uart_config(int

fd,int

baude,int

c_flow,

intbits,

char

parity,

intstop);

int

uart_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)//啟用配置

return

0;

}

接下來是安全讀(防止記憶體溢位)

**如下:

int

safe_read(int

fd,char

*vptr,

size_t

len)

else

if(nread==

0)

}
left-=nread;//read成功後,剩餘要讀取的位元組自減
ptr+=nread;//指標向後移,避免後讀到的字元覆蓋先讀到的字元
}
return

(len-left);

}

然後是串列埠的讀,這裡主要是設定多路i/o,用到select函式

int

uart_read(int

fd,char

*r_buf,

size_t

lenth);

int

uart_read(int

fd,char

*r_buf,

size_t

lenth)

return

cnt;

}
}
最後乙個函式是串列埠的關閉

int

uart_close(int

fd);

int

uart_close(int

fd)

最後是main函式

實驗成功

樹莓派 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...