linux下串口編程非常全面_第1頁
linux下串口編程非常全面_第2頁
linux下串口編程非常全面_第3頁
linux下串口編程非常全面_第4頁
linux下串口編程非常全面_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

TOC\o"1-2"\h\z\uLinux下串口編程入門教 Linux操作系統(tǒng)下的串口通信學(xué)習(xí)筆 一、什么是串口通 二、串口通信的分 三、什么是RS- 五、全雙工與半雙 六、流量控 七、串口的訪 打開串 關(guān)閉串 寫串 讀串 Linux/pub/article/c302a87895Linux操作系統(tǒng)從一開始就對(duì)串行口提供了很好的支持,本文就Linux下的串行口通訊編是RS-232-C接口(又稱EIARS-232-C)它是在1970年由美國電子工業(yè)協(xié)會(huì)(EIA)聯(lián)術(shù)標(biāo)準(zhǔn)"25DB25連接器,對(duì)連接器的每個(gè)引腳的信號(hào)內(nèi)容加以規(guī)定,還對(duì)各種信號(hào)的電平加以規(guī)定。傳輸距離在碼元畸變小于4%的情況下,傳輸電50Linux操作系統(tǒng)從一開始就對(duì)串行口提供了很好的支持,本文就Linux下的串行口通訊編程進(jìn)行簡單的介紹,如果要非常深入了解,建議看看本文所參考的《SerialProgrammingGuideforPOSIXOperatingSystems》#include<stdio.h>/*標(biāo)準(zhǔn)輸入輸出定義*/#include<stdlib.h>/*標(biāo)準(zhǔn)函數(shù)庫定義*/#includeunistd.h>*Unix標(biāo)準(zhǔn)函數(shù)定義*/#include<sys/types.h>#include#include<fcntl.h>*文件控制定義#include<termios.h>/*PPSIX終端控制定義*/#include<errno.h>/*錯(cuò)誤號(hào)定義*/在Linux下串口文件是位于/dev下的。串口一為/dev/ttyS0,串口二為/dev/ttyS1。打intfd=open("/dev/ttyS0",O_RDWR);if(-1==fd){/*不能打開串口一*/perror(提示錯(cuò)誤!");}最基本的設(shè)置串口包括波特率設(shè)置,效驗(yàn)位和停止位設(shè)置。串口的設(shè)置主要是設(shè)置structtermios結(jié)構(gòu)體的各成員值。structunsignedshortc_iflag**/unsignedshortc_oflag;/*輸出模式標(biāo)志*/unsignedshortc_cflag;/*控制模式標(biāo)志*/unsignedshortc_lflag;/*localmodeflags*/unsignedcharc_line;/*linediscipline*/unsignedcharc_cc[NCC];/*controlcharacters*/波特率設(shè)置下面是修改波特率的代碼:structtermiosOpt;*@brief*@paramfdint*@paramspeedint*@returnintspeed_arr[]={B38400,B19200,B9600,B4800,B2400,B1200,B300,B38400,B19200,B9600,B4800,B2400,B1200,B300,};intname_arr[]={38400,19200,9600,4800,2400,1200,300,19200,9600,4800,2400,1200,300,voidset_speed(intfd,intspeed){inti;intstructtermiosOpt;tcgetattr(fd,&Opt);for(i=0;i<sizeof(speed_arr)/sizeof(int);{if(speed==name_arr[i]){tcflush(fd,TCIOFLUSH);cfsetispeed(&Opt,speed_arr[i]);if(status!=0){}}}}*@brief*@paramfdint*@paramdatabitsint7*@paramstopbitsint1*@paramparityintintset_Parity(intfd,intdatabits,intstopbits,int{structtermiosif(tcgetattr(fd,&options)!={perror("SetupSerial1");}options.c_cflag&=~CSIZE;{casecasefprintf(stderr,"Unsupporteddatasizen");return}switch{casecaseoptions.c_cflag&=~PARENB;/*Clearparityenable*/options.c_iflag&=~INPCK;/*Enableparitychecking*/casecaseoptions.c_cflag|=(PARODD|PARENB);/*設(shè)置為奇效驗(yàn)*/options.c_iflag|INPCK*Disnableparitychecking*break;case'e':caseoptions.c_cflag|=PARENB;/*Enableparity*/options.c_cflag&=~PARODD;/*轉(zhuǎn)換為偶效驗(yàn)*/options.c_iflag|=INPCK*Disnableparitychecking*/casecase's':/*asnoparity*/options.c_cflag&=~PARENB;options.c_cflag&=~CSTOPB;break;fprintf(stderr,"Unsupportedparityn");return(FALSE);}/*設(shè)置停止位*/switch(stopbits){casecasefprintf(stderr,"Unsupportedstopbitsn");return(FALSE);}/*Setinputparityoption*/if(parity!='n')options.c_iflag|=INPCK;options.c_cc[VTIME]=150;/*設(shè)置超時(shí)15seconds*/options.c_cc[VMIN0;*UpdatetheoptionsanddoitNOW*/if(tcsetattr(fd,TCSANOW,&options)!=0){perror("SetupSerial3");return(FALSE);}return}使用原始模式(RawMode)方式來通訊,設(shè)置方式如下:options.c_lflag&=~(ICANON|ECHO|ECHOE|ISIG);/*Input*/options.c_oflag&=~OPOST;/*Output*/charbuffer[1024];intLength;intnByte;nByte=write(fd,bufferread函數(shù)讀取,如果設(shè)置為原始模式(RawMode)read函數(shù)返或者select等來操作。charbuff[1024];intLen;intreadByte=#defineFALSE-1#defineTRUEintOpenDev(char*Dev){intfd=open(Dev,O_RDWRif(-1==fd){perror("Can'tOpenSerialPort");return-1;}}intmain(intargc,**argv){intfd;intnread;charchar*devdev/ttyS1";串口二fd=OpenDev(dev);if(set_Parity(fd,8,1,'N')=={printf("SetParityErrorn");exit(0);}while1){while((nread=read(fd,buff,{buff[nread+1]='';printf("n%s",}}//exit}或者為0。 |同步||||| |||||| 12個(gè),用于接收端對(duì)接收到的字符序列進(jìn)行正確性的|D7|0/1|1|0|D0|D1|D2|D3|D4|D5|D6|D7|0/1|1|0位位位位|1|0|D0|D1|D2|D3|D4|D5|D6|D7|0/1|1|1|1|1|0閑始校驗(yàn)止始RS-232-C接口(EIARS-232-C)1970HPZe2202AP2USB接口、11394接口,PCMCIA擴(kuò)展插槽。除此之外,這款機(jī)型同樣配備擴(kuò)展端口,擴(kuò)展性無疑用X0FF,DC3,八進(jìn)制023來標(biāo)志結(jié)束。CTS0,1。對(duì)應(yīng)的發(fā)送端準(zhǔn)備發(fā)送數(shù)據(jù)時(shí),設(shè)置RTS0。LINUXopen函數(shù)來打開的,不過需要注意的是,一般用戶是intopen(constchar*pathname,intoflag,.../*,mode_t-intoflag文件打開方式,可用標(biāo)志如下:O_RDONLY以只讀方式打開文件O_WRONLY以只寫方式打開文件O_RDWR以讀寫方式打開文件O_APPEND寫入數(shù)據(jù)時(shí)添加到文件末尾O_EXCLO_CREATE標(biāo)志,如果打開的文件存在則會(huì)產(chǎn)生O_TRUNC如果文件存在并且成功以寫或者只寫方式打開,則清除文件所有內(nèi)容,使得文件長度變?yōu)?O_NOCTTY如果打開的是一個(gè)終端設(shè)備,這個(gè)程序不會(huì)成為對(duì)應(yīng)這個(gè)端口的控制終信號(hào)線的狀態(tài),如果指定該標(biāo)志,進(jìn)程將一直在休眠狀態(tài),直到DCD0。O_SYNC對(duì)I/O進(jìn)行寫等待intfd;*fd=open("/dev/ttyS0",O_RDWR|0_NOCTTY|intfiledes文件描述符intret**/ret=close(fd);intfiledesconstvoid*buffsize_tnbytes寫入數(shù)據(jù)字節(jié)數(shù)-intn0;/**/n=write(fd,"ATZ\r",4);if(n==-1){}intfiledessize_tnbytes需要讀取的字節(jié)數(shù)則可以使用fcntl函數(shù)來設(shè)置文件訪問屬性。例如:通過fcntl(fd,F_SETFL,0)可以設(shè)置回一般狀態(tài)。5個(gè)字節(jié)的應(yīng)答數(shù)據(jù)intnRead**/charbuffer[256];/*接收緩沖區(qū)*/nRead=read(fd,buffer,5);if(nRead==-1){}該結(jié)構(gòu)定義在termios.h文件中。{tcflag_tc_iflag;/**/tcflag_tc_oflag;/**/tcflag_tc_cflag;/**/tcflag_tc_lflag;/**/cc_tc_cc[NCCS];/*控制特性*/FlagBREAK將使得輸入和輸出隊(duì)列被刷新,如果終端是一個(gè)前臺(tái)進(jìn)程組的控制終端,這個(gè)進(jìn)程組中所有進(jìn)程將收到SIGINT信號(hào)。如果既未設(shè)置IGNBRK也未設(shè)置BRKINT,BREAKNULPARMRK,這種情況下被視為INLCRNLCR。IGNCR忽略輸入中的回車。ICRNL將輸入中的回車翻譯為新行字符(IGNCR)。IUCLC(POSIX)將輸入中的大寫字母映射為小寫字母。IXON啟用輸出的XON/XOFF流控制IXOFF啟用輸入的XON/XOFF流控制FlagONLCR(XSI)將輸出中的新行符映射為回車-換行OCRNL將輸出中的回車映射為新行符。ONOCR不在第0列輸出回車。ONLRET不輸出回車。則是ASCIINUL。為TAB3,即XTABS,將擴(kuò)展跳格為空格(每個(gè)跳格符填充8個(gè)空格)。VTDLY豎直跳格掩碼。取值為VT0或VT1。c_cflag成員FlagCSTOPB設(shè)置兩個(gè)停止位。CREAD左移了IBSHIFT位。FlagISIG當(dāng)接收到字符INTR,QUIT,SUSPDSUSP時(shí),產(chǎn)生相應(yīng)的信號(hào)。ECHOCTL(POSIX)ECHOTAB,NL,START和碼。例如字符0x08(BS)被回顯為^H。每個(gè)字符,如同指定了ECHOE和ECHORPT一樣。符DISCARD來打開和關(guān)閉。符被重新輸出。(bash用他來處理typeahead)。特殊字符EOL2,LNEXT,REPRINT和WERASE,IUCLC標(biāo)志才有效。FlagVERASE0177,DEL,rubout,or010,BS,Ctrl-H,oralso#)刪除字符。刪除上VKILL025,NAK,Ctrl-U,orCtrl-Xoralso@)EOF或行首以來的輸入。當(dāng)設(shè)置ICANON時(shí)可被識(shí)別,不再作為輸入傳遞。VEOF004,EOT,Ctrl-D)tty緩沖中的內(nèi)容被送到等待輸入的用戶程序中,而不必等到EOL。如果它是一行的第一個(gè)字符,那read()0EOFICANON時(shí)可被識(shí)別,VMINcanonicalVEOL0NUL)附加的行尾字符。當(dāng)設(shè)ICANONVTIMEcanonical模式讀時(shí)的延時(shí),以十分之一秒為單位。VEOL2(notinPOSIX;0,NUL)另一個(gè)行尾字符。當(dāng)設(shè)置ICANON時(shí)可VEOL0NUL)ICANONVEOL2(notinPOSIX;0,NUL)ICANON時(shí)可被識(shí)別。VSWTCH(notinPOSIX;notsupportedunderLinux;0,NUL)開關(guān)字符。(只為shl所用。)VSTART021DC1Ctrl-Q)Stop字符中止的輸出。當(dāng)設(shè)置IXON時(shí)可被識(shí)別,不再作為輸入傳遞。VSTOP023,DC3,Ctrl-S)StartVSUSP032SUBCtrl-ZSIGTSTPISIG時(shí)可被VDSUSPnotinPOSIX;notsupportedunderLinux;031,EM,Ctrl-Y)延時(shí)掛起信號(hào)。當(dāng)用戶程序讀到這個(gè)字符時(shí),發(fā)送SIGTSTP信號(hào)。當(dāng)設(shè)置IEXTEN和取消它的任何特殊含義。當(dāng)設(shè)置IEXTEN時(shí)可被識(shí)別,不再作為輸入傳遞。VWERASE(notinPOSIX;027,ETB,Ctrl-W)刪除詞。當(dāng)設(shè)置ICANON和IEXTEN時(shí)可被識(shí)別,不再作為輸入傳遞。)ICANONIEXTENVDISCARD(notinPOSIXnotsupportedunderLinux017SICtrl-O開關(guān):開始/結(jié)束丟棄未完成的輸出。當(dāng)設(shè)置IEXTEN時(shí)可被識(shí)別,不再作為輸入傳遞。VSTATUS(notinPOSIX;notsupportedunderLinux;statusrequest:024,DC4,Ctrl-T).息是通過cfgetispeed和cfgetospeed函數(shù)來完成的。speed_tspeed需要設(shè)置的輸出波特率cfsetispeed函數(shù)intcfsetispeed(structtermios*termptr,speed_tspeed_tspeed需要設(shè)置的輸入波特率cfgetospeed函數(shù)conststructtermiostermios結(jié)構(gòu)的指針conststructtermios*termptrtermios結(jié)構(gòu)的指針CBAUD掩碼option.c_cflag&=~CSIZE;option.c_cflag|=CS7;Noparity(8N1):options.c_cflag&=~PARENBoptions.c_cflag&=~CSIZE;options.c_cflag|=CS8;Evenparity(7E1):options.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論