串口屬性設(shè)置_第1頁(yè)
串口屬性設(shè)置_第2頁(yè)
串口屬性設(shè)置_第3頁(yè)
串口屬性設(shè)置_第4頁(yè)
串口屬性設(shè)置_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

屬性描述串口屬于終端設(shè)備,其接口屬性用termios結(jié)構(gòu)描述,如程序清單13.9所示。程序清單13.9termios結(jié)構(gòu)structtermios{tcflag_tc_cflag/*控制標(biāo)志*/tcflag_tc_iflag;/*輸入標(biāo)志*/tcflag_tc_oflag;/*輸出標(biāo)志*/tcflag_tc_lflag;/*本地標(biāo)志*/tcflag_tc_cc[NCCS];/*控制字符*/};粗略而言,控制標(biāo)志影響到RS-232串行線(如:忽略調(diào)制解調(diào)器的狀態(tài)線、每個(gè)字符需要一個(gè)或兩個(gè)停止位等),輸入標(biāo)志由終端設(shè)備驅(qū)動(dòng)程序用來(lái)控制字符的輸入(如:剝除輸入字節(jié)的第8位,允許輸入奇偶校驗(yàn)等),輸出控制則控制驅(qū)動(dòng)程序輸出(如:執(zhí)行輸出處理、將換行符映射為CR/LF等),本地標(biāo)志影響驅(qū)動(dòng)程序和用戶(hù)之間的接口(如:本地回顯的開(kāi)和關(guān)等),c_cc數(shù)組則包含了所有可以更改的特殊字符。(1)控制標(biāo)志c_cflag成員控制著波特率、數(shù)據(jù)位、奇偶校驗(yàn)、停止位以及流控制,表13.4列出了c_cflag可用的部分選項(xiàng)。表13.4c_cflag部分可用選項(xiàng)標(biāo)志說(shuō)明標(biāo)志說(shuō)明CBAUD波特率位屏蔽CSIZE數(shù)據(jù)位屏蔽B00位/秒(掛起)CS55位數(shù)據(jù)位B110100位/秒CS66位數(shù)據(jù)位B134134位/秒CS77位數(shù)據(jù)位B12001200位/秒CS88位數(shù)據(jù)位B24002400位/秒CSTOPB2位停止位,否則為1位B48004800位/秒CREAD啟動(dòng)接收B96009600位/秒PARENB進(jìn)行奇偶校驗(yàn)B1920019200位/秒PARODD奇校驗(yàn),否則為偶校驗(yàn)B5760057600位/秒HUPCL最后關(guān)閉時(shí)斷開(kāi)B115200115200位/秒CLOCAL忽略調(diào)制調(diào)解器狀態(tài)行B460800460800位/秒——c_cflag成員的CREAD和CLOCAL選項(xiàng)通常是要啟用的,這兩個(gè)選項(xiàng)使驅(qū)動(dòng)程序啟動(dòng)接收字符裝置,同時(shí)忽略串口信號(hào)線的狀態(tài)。(2)輸入標(biāo)志c_iflag成員負(fù)責(zé)控制串口輸入數(shù)據(jù)的處理,表13.5所示是c_iflag的部分可用標(biāo)志。表13.5c_iflag標(biāo)志.標(biāo)志說(shuō)明INPCK打開(kāi)輸入奇偶校驗(yàn)IGNPAR忽略奇偶錯(cuò)字符PARMRK標(biāo)記奇偶錯(cuò)ISTRIP剝除字符第8位IXON啟用/停止輸出控制流起作用IXOFF啟用/停止輸入控制流起作用IGNBRK忽略BREAK條件INLCR將輸入的NL轉(zhuǎn)換為CRIGNCR忽略CRICRNL將輸入的CR轉(zhuǎn)換為NL設(shè)置輸入校驗(yàn)當(dāng)c_cflag成員的PARENB(奇偶校驗(yàn))選項(xiàng)啟用時(shí),c_iflag的也應(yīng)啟用奇偶校驗(yàn)選項(xiàng)。操作方法是啟用INPCK和ISTRIP選項(xiàng):options.c_iflag|=(INPCK|ISTRIP);注意:IGNPAR選項(xiàng)在一些場(chǎng)合的應(yīng)用帶有一定的危險(xiǎn)性,它指示串口驅(qū)動(dòng)程序忽略奇偶校驗(yàn)錯(cuò)誤,也就是說(shuō),IGNPAR使奇偶校驗(yàn)出錯(cuò)的字符也通過(guò)輸入。這在測(cè)試通信鏈路的質(zhì)量時(shí)也許有用,但在通常的數(shù)據(jù)通信應(yīng)用中不應(yīng)使用。設(shè)置軟件流控制使用軟件流控制是啟用IXON、IXOFF和IXANY選項(xiàng):options.c_iflag|=(IXON|IXOFF|IXANY);相反,要禁用軟件流控制是禁止上面的選項(xiàng):options.c_iflag&=~(IXON|IXOFF|IXANY);輸出標(biāo)志c_oflag成員管理輸出過(guò)濾,如表13.6所示是c_oflag成員的部分選項(xiàng)標(biāo)志。表13.6c_oflag標(biāo)志標(biāo)志說(shuō)明BSDLY退格延遲屏蔽CMSPAR標(biāo)志或空奇偶性CRDLYCR延遲屏蔽FFDLY換頁(yè)延遲屏蔽OCRNL將輸出的CR轉(zhuǎn)換為NLOFDEL填充符為DEL,否則為NULLOFILL對(duì)于延遲使用填充符OLCUC將輸出的小寫(xiě)字符轉(zhuǎn)換為大寫(xiě)字符ONLCR將NL轉(zhuǎn)換為CR-NLONLRETNL執(zhí)行CR功能ONOCR在0列不輸出CROPOST執(zhí)行輸出處理OXTABS將制表符擴(kuò)充為空格啟用輸出處理啟用輸出處理需要在c_oflag成員中啟用OPOST選項(xiàng),其操作方法如下:options.c_oflag|=OPOST;使用原始輸出使用原始輸出,就是禁用輸出處理,使數(shù)據(jù)能不經(jīng)過(guò)處理、過(guò)濾地完整地輸出到串口接口。當(dāng)OPOST被禁止,c_oflag其它選項(xiàng)也被忽略,其操作方法如下:options.c_oflag&=~OPOST;本地標(biāo)志本地標(biāo)志c_lflag控制著串口驅(qū)動(dòng)程序如何管理輸入的字符,如表13.7所示是c_lflag的部分可用標(biāo)志。表13.7c_lflag標(biāo)志標(biāo)志 說(shuō)明ISIG 啟用終端產(chǎn)生的信號(hào)ICANON 啟用規(guī)范輸入XCASE 規(guī)范大/小寫(xiě)表示ECHO 進(jìn)行回送ECHOE 可見(jiàn)擦除字符ECHOK 回送kill符ECHONL 回送NLNOFLSH 在中斷或退出鍵后禁用刷清IEXTEN 啟用擴(kuò)充的輸入字符處理ECHOCTL 回送控制字符為A(char)ECHOPRT 硬拷貝的可見(jiàn)擦除方式ECHOKE Kill的可見(jiàn)擦除PENDIN 重新打印未決輸入TOSTOP 對(duì)于后臺(tái)輸出發(fā)送SIGTTOU選擇規(guī)范模式規(guī)范模式是行處理的。調(diào)用read讀取串口數(shù)據(jù)時(shí),每次返回一行數(shù)據(jù)。當(dāng)選擇規(guī)范模式時(shí),需要啟用ICANON、ECHO和ECHOE選項(xiàng):options.c_lflag1=(ICANONIECHOIECHOE);當(dāng)串口設(shè)備作為用戶(hù)終端時(shí),通常要把串口設(shè)備配置成規(guī)范模式。選擇原始模式在原始模式下,串口輸入數(shù)據(jù)是不經(jīng)過(guò)處理的,在串口接口接收的數(shù)據(jù)被完整保留。要使串口設(shè)備工作在原始模式,需要關(guān)閉ICANON、ECHO、ECHOE和ISIG選項(xiàng),其操作方法如下:options.c_lflag&=?(ICANONIECHOIECHOEIISIG);(4)控制字符組c_cc數(shù)組的長(zhǎng)度是NCCS,一般介于15-20之間。c_cc數(shù)組的每個(gè)成員的下標(biāo)都用一個(gè)宏表示,表13.8列出了c_cc的部分下標(biāo)標(biāo)志名及其對(duì)應(yīng)說(shuō)明。表13.8c_cc標(biāo)志標(biāo)志 說(shuō)明VINTR 中斷VQUIT 退出VERASE 擦除VEOF 行結(jié)束VEOL 行結(jié)束VMIN 需讀取的最小字節(jié)數(shù)VTIME 與“VMIN”配合使用,是指限定的傳輸或等待的最長(zhǎng)時(shí)間在規(guī)范模式下,調(diào)用read讀取串口數(shù)據(jù)時(shí),通常是返回一行數(shù)據(jù)。而在原始模式下,串口輸入數(shù)據(jù)是不分行的。在原始模式下,返回讀取數(shù)據(jù)的數(shù)量需要考慮兩個(gè)變量:MIN和TIME。MIN和TIME在c_cc數(shù)組中的下標(biāo)名為VMIN和VTIME。MIN是指一次read調(diào)用期望返回的最小字節(jié)數(shù)。TIME與MIN組合使用,其具體含義分以下四種情形:1) 當(dāng)MIN>0,TIME>0時(shí)TIME為接收到第一個(gè)字節(jié)后允許的數(shù)據(jù)傳輸或等待的最長(zhǎng)分秒數(shù)(1分秒=0.1秒)。定時(shí)器在收到第一個(gè)字節(jié)后啟動(dòng),在計(jì)時(shí)器超時(shí)之前,若已收到MIN個(gè)字節(jié),則read返回MIN個(gè)字節(jié),否則,在計(jì)時(shí)器超時(shí)后返回實(shí)際接收到的字節(jié)。注意:因?yàn)橹挥性诮邮盏降谝粋€(gè)字節(jié)時(shí)才啟動(dòng),所以至少可以返回1個(gè)字節(jié)。這種情形中,在接到第一個(gè)字節(jié)之前,調(diào)用者阻塞。如果在調(diào)用read時(shí)數(shù)據(jù)已經(jīng)可用,則如同在read后數(shù)據(jù)立即被接到一樣。2) 當(dāng)MIN>0,TIME=0時(shí)MIN個(gè)字節(jié)完整接收后,read才返回,這可能會(huì)造成read無(wú)限期地阻塞。3) 當(dāng)MIN=0,TIME>0時(shí)TIME為允許等待的最大時(shí)間,計(jì)時(shí)器在調(diào)用read時(shí)立即啟動(dòng),在串口接到1字節(jié)數(shù)據(jù)或者計(jì)時(shí)器超時(shí)后即返回,如果是計(jì)時(shí)器超時(shí),則返回0。4) 當(dāng)MIN=0,TIME=0時(shí)如果有數(shù)據(jù)可用,則read最多返回所要求的字節(jié)數(shù),如果無(wú)數(shù)據(jù)可用,則read立即返回0。屬性設(shè)置使用函數(shù)tcgetattr和tcsetattr可以獲取和設(shè)置串口termios結(jié)構(gòu)屬性,如程序清單13.10所示。程序清單13.10設(shè)置和獲取termios結(jié)構(gòu)屬性#include<termios.h>/*使用終端接口函數(shù)需要使用此頭文件*/inttcgetattr(intfd,structtermios*termptr);inttcsetattr(intfd,intopt,conststructtermios*termptr);其中:fd為串口設(shè)備文件描述符,termptr參數(shù)在tcgetattr函數(shù)中是用于存放串口設(shè)置的termios結(jié)構(gòu)體,opt是整形變量,使用方法如下:1) TCSANOW:更改立即發(fā)生;2) TCSADRAIN:發(fā)送了所有輸出后更改才發(fā)生,若更改輸出參數(shù)則應(yīng)用此選項(xiàng);3) TCSAFLUSH:發(fā)送了所有輸出后更改才發(fā)生,更進(jìn)一步,在更改發(fā)生時(shí)未讀的所有輸入數(shù)據(jù)被刪除(Flush)。在串口驅(qū)動(dòng)程序里,有輸入緩沖區(qū)和輸出緩沖區(qū)。在改變串口屬性時(shí),緩沖區(qū)中的數(shù)據(jù)可能還存在,這時(shí)需要考慮到更改后的屬性什么時(shí)候起作用。tcsetattr的參數(shù)opt可以指定在什么時(shí)候新的串口屬性才起作用。上述兩函數(shù)執(zhí)行時(shí),若成功則返回0,若出錯(cuò)則返回-1。掌握了如何獲取和設(shè)置串口的屬性結(jié)構(gòu)后,下面將介紹串口主要屬性的修改,即修改termios結(jié)構(gòu)體的成員。termios結(jié)構(gòu)體的各個(gè)成員的各個(gè)選項(xiàng)中除需要用屏蔽標(biāo)志的選項(xiàng)外(如波特率選項(xiàng)、數(shù)據(jù)位選項(xiàng)等),都是按位表示的,對(duì)這些選項(xiàng)的設(shè)置或清除可以直接用你”或“&”邏輯運(yùn)算來(lái)完成。需要用屏蔽標(biāo)志的選項(xiàng)的話(huà)則需要先用“&”運(yùn)算清除原設(shè)置,再用“人”運(yùn)算設(shè)置新選項(xiàng)。例如,為了設(shè)置字符長(zhǎng)度,需先用字符長(zhǎng)度屏蔽標(biāo)志CSIZE將表示字符長(zhǎng)度的位清0,然后再將對(duì)應(yīng)位設(shè)置為CS5、CS6、CS7或CS8。設(shè)置波特率串口的輸入和輸出波特率可分別用cfsetispeed()和cfsetospeed()函數(shù)來(lái)設(shè)置,如程序清單13.11所示。程序清單13.11設(shè)置串口輸入/輸出波特率函數(shù)#include<termios.h>intcfsetispeed(structtermios*termptr,speed_tspeed);intcfsetospeed(structtermios*termptr,speed_tspeed);這兩個(gè)函數(shù)若執(zhí)行成功返回0,若出錯(cuò)則返回-1。使用這兩個(gè)函數(shù)時(shí),應(yīng)當(dāng)理解輸入、輸出波特率是存在串口設(shè)備termios結(jié)構(gòu)中的。在調(diào)用任一cfset函數(shù)之前,先要用tcgetattr獲得設(shè)備的termios結(jié)構(gòu)。與此類(lèi)似,在調(diào)用任一cfset函數(shù)后,波特率都被設(shè)置到termios結(jié)構(gòu)中。為使這種更改影響到設(shè)備,應(yīng)當(dāng)調(diào)用tcsetattr函數(shù)。操作方法如程序清單13.12所示。程序清單13.12設(shè)置波特率示例if(tcgetattr(fd,&opt)<0){returnERROR;}cfsetispeed(&opt,B9600);cfsetospeed(&opt,B9600);if(tcsetattr(fd,TCSANOW,&opt)<0){returnERROR;}設(shè)置數(shù)據(jù)位設(shè)置數(shù)據(jù)位不需要專(zhuān)用的函數(shù),只需要在設(shè)置數(shù)據(jù)位之前用數(shù)據(jù)位屏蔽標(biāo)志CSIZE)把對(duì)應(yīng)數(shù)據(jù)位清零,然后再設(shè)置新的數(shù)據(jù)位即可,如下所示:options.c_cflag&=~CSIZE;/*先把數(shù)據(jù)位清零*/options.c_cflag|=CS8;/*把數(shù)據(jù)位設(shè)置為8位*/設(shè)置奇偶校驗(yàn)正如設(shè)置數(shù)據(jù)位一樣,設(shè)置奇偶校驗(yàn)是在直接在cflag成員上設(shè)置。下面是各種類(lèi)型的校驗(yàn)設(shè)置方法。無(wú)奇偶校驗(yàn)(8N1):options.c_cflag&=~PARENB;options.c_cflag&=~CSTOPB;options.c_cflag&=~CSIZE;options.c_cflag|=CS8;7位數(shù)據(jù)位奇偶校驗(yàn)(7E1):options.c_cflag|=PARENB;options.c_cflag&=~PARODD;options.c_cflag&=~CSTOPB;options.c_cflag&=~CSIZE;options.c_cflag|=CS7;奇校驗(yàn)(7O1):options.c_cflagl=PARENB;options.c_cflagl=PARODD;options.c_cflag&=~CSTOPB;options.c_cflag&=~CSIZE;options.c_cflag|=CS7;串口設(shè)置示例:staticintUART2_Init(void){structtermiosopt;//屬性描述fdUart2=open(DEV_UART2,O_RDWR|O_NOCTTY);if(fdUart2<0){perror(DEV_UART2);return-1;}tcgetattr(fdUart2,&opt); 〃獲取串口屬性結(jié)構(gòu)體對(duì)象cfsetispeed(&opt,B38400); 〃設(shè)置輸入波特率cfsetospeed(&opt,B38400); 〃設(shè)置輸出波特率/*rawmode*/ 〃偶校驗(yàn)opt.c_lflag&=~(ECHO|ICANON|IEXTEN|ISIG);//

溫馨提示

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

評(píng)論

0/150

提交評(píng)論