《linux串口編程(中嵌教育-嵌入式linux開發(fā)ppt課件)》由會(huì)員分享,可在線閱讀,更多相關(guān)《linux串口編程(中嵌教育-嵌入式linux開發(fā)ppt課件)(17頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、,單擊此處編輯母版文本樣式,第二級(jí),第三級(jí),第四級(jí),第五級(jí),單擊此處編輯母版標(biāo)題樣式,www.chinaEDA.cn,linux串口,應(yīng)用,開發(fā),串口,概述,串口設(shè)置,串口使用詳解,linux串口應(yīng)用開發(fā)串口概述,1,、,串口,概述,用戶常見的數(shù)據(jù)通信的基本方式有兩種:,并行通信;,串行通信;,串行通信是計(jì)算機(jī)常用的接口,如:,RS-232-C,接口。該標(biāo)準(zhǔn)規(guī)定采用一個(gè),DB25,芯引腳連接器或,DB9,芯引腳連接器。,芯片內(nèi)部常具有,UART,控制器,其可工作于,Interrupt(,中斷模式,),或,DMA,(直接內(nèi)存訪問)模式。,1、串口概述用戶常見的數(shù)據(jù)通信的基本方式有兩種:,UART
2、,的操作主要包括以下幾個(gè)部分:,數(shù)據(jù)發(fā)送;,數(shù)據(jù)接收;,產(chǎn)生中斷;,產(chǎn)生波特率;,Loopback,模式;,紅外模式;,自動(dòng)流控模式;,串口參數(shù)的配置主要包括:波特率、數(shù)據(jù)位、停止位、流控協(xié)議。,UART的操作主要包括以下幾個(gè)部分:,linux,中的串口設(shè)備文件存放于,/dev,目錄下,其中串口一,串口二對(duì)應(yīng)設(shè)備名依次為“,/dev/ttyS0”,、“,/dev/ttyS1”,。,在,linux,下操作串口與操作文件相同。,linux中的串口設(shè)備文件存放于/dev目錄下,其中串口一,2、串口詳細(xì)配置,在使用串口之前必須設(shè)置相關(guān)配置,包括:波特率、數(shù)據(jù)位、校驗(yàn)位、停止位等。串口設(shè)置由下面結(jié)構(gòu)體實(shí)
3、現(xiàn):,2、串口詳細(xì)配置在使用串口之前必須設(shè)置相關(guān)配置,包括:波特,該結(jié)構(gòu)中,c_cflag,最為重要,可設(shè)置波特率、數(shù)據(jù)位、校驗(yàn)位、停止位。在設(shè)置波特率時(shí)需在數(shù)字前加上,B,,如,B9600,。,B19200,。使用其需通過“與”“或”操作方式。,該結(jié)構(gòu)中c_cflag最為重要,可設(shè)置波特率、數(shù)據(jù)位、,輸入模式,c_iflag,成員控制端口接收端的字符輸入處理。,輸入模式c_iflag成員控制端口接收端的字符輸入處理,串口控制函數(shù),Tcgetattr,取屬性,(termios,結(jié)構(gòu),),Tcsetattr,設(shè)置屬性,(termios,結(jié)構(gòu),),cfgetispeed,得到輸入速度,Cfgeto
4、speed,得到輸出速度,Cfsetispeed,設(shè)置輸入速度,Cfsetospeed,設(shè)置輸出速度,Tcdrain,等待所有輸出都被傳輸,tcflow,掛起傳輸或接收,tcflush,刷清未決輸入和,/,或輸出,Tcsendbreak,送,BREAK,字符,tcgetpgrp,得到前臺(tái)進(jìn)程組,ID,tcsetpgrp,設(shè)置前臺(tái)進(jìn)程組,ID,串口控制函數(shù)Tcgetattr取屬性(termios結(jié)構(gòu),2.1串口配置流程,保存原先串口配置使用,tcgetattr(fd,&oldtio),函數(shù),struct termios newtio,oldtio;,tcgetattr(fd,&oldtio,);
5、,激活選項(xiàng)有,CLOCAL,和,CREAD,用于本地連接和接收使能。,newtio.c_cflag|=CLOCAL|CREAD;,設(shè)置波特率,使用函數(shù),cfsetispeed,、,cfsetospeed,cfsetispeed(,cfsetospeed(,2.1串口配置流程保存原先串口配置使用tcgetattr(f,設(shè)置數(shù)據(jù)位,需使用掩碼設(shè)置。,newtio.c_cflag,newtio.c_cflag|=CS8;,設(shè)置奇偶校驗(yàn)位,使用,c_cflag,和,c_iflag,。,設(shè)置奇校驗(yàn):,newtio.c_cflag|=PARENB;,newtio.c_cflag|=PARODD;,newt
6、io.c_iflag|=(INPCK|ISTRIP);,設(shè)置偶校驗(yàn):,newtio.c_iflag|=(INPCK|ISTRIP);,newtio.c_cflag|=PARENB;,newtio.c_cflag,設(shè)置數(shù)據(jù)位,需使用掩碼設(shè)置。,設(shè)置停止位,通過激活,c_cflag,中的,CSTOPB,實(shí)現(xiàn)。若停止位為,1,,則清除,CSTOPB,,若停止位為,2,,則激活,CSTOPB,。,newtio.c_cflag,設(shè)置最少字符和等待時(shí)間,對(duì)于接收字符和等待時(shí)間沒有特別要求時(shí),可設(shè)為,0,。,newtio.c_ccVTIME =0;,newtio.c_ccVMIN=0;,設(shè)置停止位,通過激活
7、c_cflag中的CSTOPB實(shí)現(xiàn)。若停,處理要寫入的引用對(duì)象,tcflush,函數(shù)刷清(拋棄)輸入緩存(終端驅(qū)動(dòng)程序已接收到,但用戶程序尚未讀)或輸出緩存(用戶程序已經(jīng)寫,但尚未發(fā)送)。,int tcflush(int,filedes,int,queue,),queue,數(shù)應(yīng)當(dāng)是下列三個(gè)常數(shù)之一:,TCIFLUSH,刷清輸入隊(duì)列。,TCOFLUSH,刷清輸出隊(duì)列。,TCIOFLUSH,刷清輸入、輸出隊(duì)列。,如:,tcflush(fd,TCIFLUSH);,處理要寫入的引用對(duì)象,激活配置。在完成配置后,需激活配置使其生效。使用,tsettattr(),函數(shù)。原型:,int tcgetattr(
8、int,filedes,struct termios*,termptr,);,int tcsetattr(int,filedes,int,opt,const struct termios*,termptr,);,tcsetattr,的參數(shù),opt,使我們可以指定在什么時(shí)候新的終端屬性才起作用。,opt,可以指定為下列常數(shù)中的一個(gè):,TCSANOW,更改立即發(fā)生。,TCSADRAIN,發(fā)送了所有輸出后更改才發(fā)生。若更改輸出參數(shù)則應(yīng)使用此選擇項(xiàng)。,TCSAFLUSH,發(fā)送了所有輸出后更改才發(fā)生。更進(jìn)一步,在更改發(fā)生時(shí)未讀的所有輸入數(shù)據(jù)都被刪除(刷清),使用如:,tcsetattr(fd,TCSAN
9、OW,&newtio),激活配置。在完成配置后,需激活配置使其生效。使用tsetta,3、串口使用詳解,在配置完串口的相關(guān)屬性后,就可對(duì)串口進(jìn)行打開,讀寫操作了。其使用方式與文件操作一樣,區(qū)別在于串口是一個(gè)終端設(shè)備。,3、串口使用詳解 在配置完串口的相關(guān)屬性后,就可對(duì)串口進(jìn),3.1 打開串口,fd=open(/dev/ttyS0,O_RDWR|O_NOCTTY|O_NDELAY);,Open,函數(shù)中除普通參數(shù)外,另有兩個(gè)參數(shù),O_NOCTTY,和,O_NDELAY,。,O_NOCTTY:,通知,linix,系統(tǒng),這個(gè)程序不會(huì)成為這個(gè)端口的控制終端。,O_NDELAY:,通知,linux,系統(tǒng)不
10、關(guān)心,DCD,信號(hào)線所處的狀態(tài)(端口的另一端是否激活或者停止)。,3.1 打開串口fd=open(/dev/ttyS0,然后,恢復(fù)串口的狀態(tài)為阻塞狀態(tài),用于等待串口數(shù)據(jù)的讀入。用,fcntl,函數(shù):,fcntl,(,fd,F_SETFL,0,),;,接著,測(cè)試打開的文件描述府是否引用一個(gè)終端設(shè)備,以進(jìn)一步確認(rèn)串口是否正確打開。,isatty(STDIN_FILENO);,然后,恢復(fù)串口的狀態(tài)為阻塞狀態(tài),用于等待串口數(shù)據(jù)的讀入,3.2 讀寫串口,串口的讀寫與普通文件一樣,使用,read,write,函數(shù)。,read(fd,buff,8);,write(fd,buff,8);,實(shí)例見:,seri.c,3.2 讀寫串口 串口的讀寫與普通文件一樣,使用read,