Linux串列埠程式設計

2021-07-16 22:23:24 字數 4216 閱讀 4195

.串列埠概述

常見資料通訊方式:並行通訊,序列通訊

uart的主要操作:

>資料傳送及接受

>產生中斷

>產生波特率

>loopback模式

>紅外模式

>自動流控模式

串列埠引數的配置主要包括:波特率、資料位、停止位、流控協議。

linux中的串列埠裝置檔案放於/de/目錄下,串列埠一,串列埠二分別為"/dev/ttys0","/dev/ttys1".在linux下操作串列埠與操作檔案相同.

.串列埠詳細配置

包括:波特率、資料位、校驗位、停止位等。串列埠設定由下面的結構體實現:

struct termios

; 該結構體中c_cflag最為重要,可設定波特率、資料位、校驗位、停止位。在設定波特率時需要在數字前加上'b',

如b9600,b15200.使用其需通過「與」「或」操作方式:

輸入模式c_iflag成員控制埠接收端的字元輸入處理:

.串列埠控制函式

tcgetattr 取屬性(termios結構)

tcsetattr 設定屬性(termios結構)

cfgetispeed 得到輸入速度

cfgetospeed 得到輸出速度

cfsetispeed 設定輸入速度

cfsetospeed 設定輸出速度

tcdrain  等待所有輸出都被傳輸

tcflow  掛起傳輸或接收

tcflush  刷清未決輸入和/或輸出

tcsendbreak 送break字元

tcgetpgrp 得到前台程序組id

tcsetpgrp 設定前台程序組id

.串列埠配置流程

1>儲存原先串列埠配置,用tcgetattr(fd,&oldtio)函式

struct termios newtio,oldtio;

tcgetattr(fd,&oldtio);

2>啟用選項有clocal和cread,用於本地連線和接收使用

newtio.c_cflag | = clocal | cread;

3>設定波特率,使用函式cfsetispeed、cfsetospeed

cfsetispeed(&newtio,b115200);

cfsetospeed(&newtio,b115200); 

4>設定資料位,需使用掩碼設定

newtio.c_cflag &= ~csize;

newtio.c_cflag |= cs8;

5>設定奇偶校驗位,使用c_cflag和c_iflag.

設定奇校驗:

newtio.c_cflag |= parenb;

newtio.c_cflag |= parodd;

newtio.c_iflag |= (inpck | istrip);

設定偶校驗:

newtio.c_iflag |= (inpck|istrip);

newtio.c_cflag |= parenb;

newtio.c_cflag |= ~parodd;

6>設定停止位,通過啟用c_cflag中的cstopb實現。若停止位為1,則清除cstopb,若停止位為2,則啟用cstopb。

newtio.c_cflag &= ~cstopb;

7>設定最少字元和等待時間,對於接收字元和等待時間沒有特別的要求時,可設為0:

newtio.c_cc[vtime] = 0;

newtio.c_cc[vmin]  = 0;

8>處理要寫入的引用物件

tcflush函式刷清(拋棄)輸入快取(終端驅動程式已接收到,但使用者程式尚未讀)或輸出快取(使用者程式已經寫,但尚未傳送).

int tcflush(int filedes,int quene)

quene數應當是下列三個常數之一:

*tciflush  刷清輸入佇列

*tcoflush  刷清輸出佇列

*tcioflush 刷清輸入、輸出佇列

例如:tcflush(fd,tciflush);

9>啟用配置。在完成配置後,需要啟用配置使其生效。使用tcsetattr()函式:

int tcsetattr(int filedes,int opt,const struct termios *termptr);

opt使我們可以指定在什麼時候新的終端屬性才起作用,

*tcsanow:更改立即發生

*tcsadrain:傳送了所有輸出後更改才發生。若更改輸出引數則應使用此選項

*tcsaflush:傳送了所有輸出後更改才發生。更進一步,在更改發生時未讀的

所有輸入資料都被刪除(刷清).

例如: tcsetattr(fd,tcsanow,&newtio);

.串列埠使用詳解

.開啟串列埠

fd = open("/dev/ttys0",o_rdwr | o_noctty | o_ndelay);

引數--o_noctty:通知linux系統,這個程式不會成為這個埠的控制終端.

o_ndelay:通知linux系統不關心dcd訊號線所處的狀態(埠的另一端是否啟用或者停止).

然後恢復串列埠的狀態為阻塞狀態,用於等待串列埠資料的讀入,用fcntl函式:

fcntl(fd,f_setfl,0);  //f_setfl:設定檔案flag為0,即預設,即阻塞狀態

接著測試開啟的檔案描述符是否應用乙個終端裝置,以進一步確認串列埠是否正確開啟.

isatty(stdin_fileno);

.讀寫串列埠

串列埠的讀寫與普通檔案一樣,使用read,write函式

read(fd,buff,8);

write(fd,buff,8);

example: seri.c

#include

#include

#include

#include

#include

#include

#include

#include

#include

int set_opt(int fd,int nspeed, int nbits, char nevent, int nstop)

bzero( &newtio, sizeof( newtio ) );

newtio.c_cflag |= clocal | cread;

newtio.c_cflag &= ~csize;

switch( nbits )

switch( nevent )

switch( nspeed )

if( nstop == 1 )

else if ( nstop == 2 )

newtio.c_cc[vtime] = 0;

newtio.c_cc[vmin] = 0;

tcflush(fd,tciflush);

if((tcsetattr(fd,tcsanow,&newtio))!=0)

printf("set done!\n");

return 0;

}int open_port(int fd,int comport)

;long vdisable;

if (comport==1)

else

}else if(comport==2)

else }

else if (comport==3)

else

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

else

if(isatty(stdin_fileno)==0)

else

printf("fd-open=%d\n",fd);

return fd;

}int main(void)

if((i=set_opt(fd,115200,8,'n',1))<0)

printf("fd=%d\n",fd);

nread=read(fd,buff,8);

printf("nread=%d,%s\n",nread,buff);

close(fd);

return;

}

linux串列埠程式設計

include 標準輸入輸出定義 include 標準函式庫定義 include unix標準函式定義 include include include 檔案控制定義 include ppsix終端控制定義 include 錯誤號定義 brief 設定串列埠通訊速率 param fd 型別 int 開...

Linux串列埠程式設計

串列埠概述 常見資料通訊方式 並行通訊,序列通訊 uart的主要操作 資料傳送及接受 產生中斷 產生波特率 loopback模式 紅外模式 自動流控模式 串列埠引數的配置主要包括 波特率 資料位 停止位 流控協議。linux中的串列埠裝置檔案放於 de 目錄下,串列埠一,串列埠二分別為 dev tt...

Linux串列埠程式設計

串列埠概述 常見資料通訊方式 並行通訊,序列通訊 uart的主要操作 資料傳送及接受 產生中斷 產生波特率 loopback模式 紅外模式 自動流控模式 串列埠引數的配置主要包括 波特率 資料位 停止位 流控協議。linux中的串列埠裝置檔案放於 de 目錄下,串列埠一,串列埠二分別為 dev tt...