版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1/30Linux下串口程序設(shè)計2嵌入式系統(tǒng)設(shè)計實驗二實驗時間 1班 10月27日19:00–21:252班 10月28日08:00–10:25實驗內(nèi)容串行端口程序設(shè)計(2.3必做,并提交實驗報告)第二章其他實驗(選做)實驗報告提交時間:下周實驗之前提交方式: 發(fā)送到郵箱:chhli@(1班),
chenbo2008@(2班), 文件命名:學(xué)號+姓名+實驗二.doc 郵件主題:嵌入式系統(tǒng)設(shè)計實驗二3串行端口程序設(shè)計實驗步驟1.閱讀理解源碼源碼位置:exp\basic\03_tty閱讀源碼方法Linux下使用vi編輯器(Linux、VI常用命令參考實驗指導(dǎo)書第七章附錄7.1、7.2)windows下使用SourceInsight軟件2.編譯應(yīng)用程序4串行端口程序設(shè)計實驗步驟3.下載調(diào)試切換到minicom終端窗口,使用NFSmount開發(fā)主機的/arm2410s到/host目錄:mount–tnfs–onolock34:/arm2410s/host開發(fā)板中串口設(shè)備位于/dev/tts/下,沒有ttyS0這個設(shè)備,所以需要建立一個連接,方法如下:
cd/devln–sf/dev/tts/ottys0進(jìn)入exp\basic\03_tty目錄,運行term,觀察運行結(jié)果的正確性。實驗?zāi)康?/p>
了解在linux環(huán)境下串行程序設(shè)計的基本方法。掌握終端的主要屬性及設(shè)置方法,熟悉終端I/O函數(shù)的使用。學(xué)習(xí)使用多線程來完成串口的收發(fā)處理。5/30實驗原理與程序分析Linux對所有各類設(shè)備文件的輸入輸出操作,看上去就像對普通文件的輸入輸出一樣,所以Linux對串口的操作,也是通過設(shè)備文件訪問的。為了訪問串口,只需要打開相應(yīng)的設(shè)備文件即可。默認(rèn)地,在Linux下,串行口COM1和COM2對應(yīng)的設(shè)備分別為/dev/ttyS0和/dev/ttyS1。串口詳細(xì)配置在使用串口之前必須設(shè)置相關(guān)配置,包括:波特率、數(shù)據(jù)位、校驗碼、停止位等。串口設(shè)置由下面結(jié)構(gòu)體實現(xiàn):structtermios{tcflag_tc_iflag;/*輸入模式*/
tcflag_tc_oflag;/*輸出模式*/
tcflag_tc_cflag;/*控制模式*/
tcflag_tc_lflag;/*本地模式*/
cc_tc_cc[NCCS];/*控制字符*/}在<arm2410s/kernel-2410s/include/asm-i386/termbits.h>中.8串行端口程序設(shè)計c_iflag輸入模式標(biāo)志,控制終端輸入方式,具體參數(shù)如下表所示。鍵
值說
明IGNBRK忽略BREAK鍵輸入BRKINT如果設(shè)置了IGNBRK,BREAK鍵的輸入將被忽略,如果設(shè)置了BRKINT,將產(chǎn)生SIGINT中斷IGNPAR忽略奇偶校驗錯誤PARMRK標(biāo)識奇偶校驗錯誤INPCK允許輸入奇偶校驗ISTRIP去除字符的第8個比特INLCR將輸入的NL(換行)轉(zhuǎn)換成CR(回車)IGNCR忽略輸入的回車ICRNL將輸入的回車轉(zhuǎn)化成換行(如果IGNCR未設(shè)置的情況下)IUCLC將輸入的大寫字符轉(zhuǎn)換成小寫字符(非POSIX)IXON允許輸入時對XON/XOFF流進(jìn)行控制IXANY輸入任何字符將重啟停止的輸出IXOFF允許輸入時對XON/XOFF流進(jìn)行控制IMAXBEL當(dāng)輸入隊列滿的時候開始響鈴,Linux在使用該參數(shù)而是認(rèn)為該參數(shù)總是已經(jīng)設(shè)置9串行端口程序設(shè)計c_oflag輸出模式標(biāo)志,控制終端輸出方式,具體參數(shù)如表6.4所示。鍵
值說
明OPOST處理后輸出OLCUC將輸入的小寫字符轉(zhuǎn)換成大寫字符(非POSIX)ONLCR將輸入的NL(換行)轉(zhuǎn)換成CR(回車)及NL(換行)OCRNL將輸入的CR(回車)轉(zhuǎn)換成NL(換行)ONOCR第一行不輸出回車符ONLRET不輸出回車符OFILL發(fā)送填充字符以延遲終端輸出OFDEL以ASCII碼的DEL作為填充字符,如果未設(shè)置該參數(shù),填充字符將是NUL(‘\0’)(非POSIX)NLDLY換行輸出延時,可以取NL0(不延遲)或NL1(延遲0.1s)CRDLY回車延遲,取值范圍為:CR0、CR1、CR2和
CR3TABDLY水平制表符輸出延遲,取值范圍為:TAB0、TAB1、TAB2和TAB3BSDLY空格輸出延遲,可以取BS0或BS1VTDLY垂直制表符輸出延遲,可以取VT0或VT1FFDLY換頁延遲,可以取FF0或FF110串行端口程序設(shè)計c_cflag控制模式標(biāo)志,指定終端硬件控制信息,具體參數(shù)如下表所示。鍵
值說
明CBAUD波特率(4+1位)(非POSIX)CBAUDEX附加波特率(1位)(非POSIX)CSIZE字符長度,取值范圍為CS5、CS6、CS7或CS8CSTOPB設(shè)置兩個停止位CREAD使用接收器PARENB使用奇偶校驗PARODD對輸入使用奇偶校驗,對輸出使用偶校驗HUPCL關(guān)閉設(shè)備時掛起CLOCAL忽略調(diào)制解調(diào)器線路狀態(tài)CRTSCTS使用RTS/CTS流控制11串行端口程序設(shè)計c_lflag本地模式標(biāo)志,控制終端編輯功能,具體參數(shù)如下表所示。鍵
值說
明ISIG當(dāng)輸入INTR、QUIT、SUSP或DSUSP時,產(chǎn)生相應(yīng)的信號ICANON使用標(biāo)準(zhǔn)輸入模式XCASE在ICANON和XCASE同時設(shè)置的情況下,終端只使用大寫。如果只設(shè)置了XCASE,則輸入字符將被轉(zhuǎn)換為小寫字符,除非字符使用了轉(zhuǎn)義字符(非POSIX,且Linux不支持該參數(shù))ECHO顯示輸入字符ECHOE如果ICANON同時設(shè)置,ERASE將刪除輸入的字符,WERASE將刪除輸入的單詞ECHOK如果ICANON同時設(shè)置,KILL將刪除當(dāng)前行ECHONL如果ICANON同時設(shè)置,即使ECHO沒有設(shè)置依然顯示換行符ECHOPRT如果ECHO和ICANON同時設(shè)置,將刪除打印出的字符(非POSIX)TOSTOP向后臺輸出發(fā)送SIGTTOU信號12串行端口程序設(shè)計c_cc[NCCS]控制字符,用于保存終端驅(qū)動程序中的特殊字符,如輸入結(jié)束符等。c_cc中定義了如表6.7所示的控制字符。宏說
明宏說
明VINTRInterrupt字符VEOL附加的End-of-file字符VQUITQuit字符VTIME非規(guī)范模式讀取時的超時時間VERASEErase字符VSTOPStop字符VKILLKill字符VSTARTStart字符VEOFEnd-of-file字符VSUSPSuspend字符VMIN非規(guī)范模式讀取時的最小字符數(shù)串口控制函數(shù)tcgetattr取屬性(termios結(jié)構(gòu))tcsetattr設(shè)置屬性(termios結(jié)構(gòu))cfgetispeed得到輸入速度cfgetospeed得到輸出速度cfsetispeed設(shè)置輸入速度cfsetospeed設(shè)置輸出速度tcdrain等待所有輸出都被傳輸tcflow掛起傳輸或接收tcflush刷清未決輸入和/或輸出tcsendbreak送BREAK字符tcgetpgrp得到前臺進(jìn)程組IDtcsetpgrp設(shè)置前臺進(jìn)程組ID打開串口1、打開串口是通過使用標(biāo)準(zhǔn)的文件打開函數(shù)操作:intfd;/*以讀寫方式打開串口*/fd=open("/dev/ttyS0",O_RDWR);if(-1==fd){/*不能打開串口一*/perror("提示錯誤!");}14/30#include<fcntl.h>intopen(constchar*pathname,intoflag)返回值:成功則返回文件描述符,否則返回-1對于open函數(shù)來說,第三個參數(shù)(...)僅當(dāng)創(chuàng)建新文件時才使用,用于指定文件的訪問權(quán)限位(accesspermissionbits)。pathname是待打開/創(chuàng)建文件的路徑名(如C:/cpp/a.cpp);oflag
用于指定文件的打開/創(chuàng)建模式,這個參數(shù)可由以下常量(定義于fcntl.h)通過邏輯或構(gòu)成。O_RDONLY
只讀模式
O_WRONLY
只寫模式
O_RDWR
讀寫模式15/30打開串口設(shè)置串口所有對串口的操作都是通過結(jié)構(gòu)體structtermios和幾個函數(shù)實現(xiàn)的,其中兩個最常用的函數(shù)是tcgetattr()和tcsetattr()幾乎在所有情況下,程序都是通過tcgetattr()函數(shù)獲取設(shè)備當(dāng)前的設(shè)置,然后修改這些設(shè)置,最后用tcsetattr()使這些設(shè)置生效。許多程序會保存終端初始的設(shè)置并在終止運行前恢復(fù)這些設(shè)置。16/30保存串口當(dāng)前狀態(tài)2、保存原先串口配置使用tcgetattr(fd,&oldtio)inttcgetattr(intfd,structtermios*t)
用于獲得文件描述符fd所表示設(shè)備的當(dāng)前設(shè)置值,并寫入指針t內(nèi).structtermiosoldtio,oldstdtio;tcgetattr(0,&oldstdtio);tcgetattr(fd,&oldtio);/*savecurrentmodemsettings*/17/30設(shè)置串口最基本的設(shè)置串口包括波特率設(shè)置,效驗位和停止位設(shè)置。串口的設(shè)置主要是設(shè)置structtermios結(jié)構(gòu)體的各成員值。18/30設(shè)置串口例子:structtermiosnewtio,newstdtio;newtio.c_cflag=CLOCAL|CREAD;/*ctrolflag*/newtio.c_cc[VMIN]=1;newtio.c_cc[VTIME]=0;19/30設(shè)置串口3、激活配置:inttcsetattr(intfd,intoptions,structtermios*t)用來將termios結(jié)構(gòu)指針t內(nèi)的設(shè)置值賦給當(dāng)前用文件描述符fd表示的設(shè)備終端參數(shù)options決定什么時候改變才生效
TCSANOW———修改立即生效
TCSADRAIN——所有已經(jīng)發(fā)送的輸出寫入fd后生效
TCSAFLUSH——輸出隊列為空時生效20/30設(shè)置串口4、處理要寫入的數(shù)據(jù)對象:tcflush()函數(shù)tcflush函數(shù)刷清(拋棄)輸入緩存(終端驅(qū)動程序已收到,但用戶程序尚未讀)或輸出緩存(用戶程序已經(jīng)寫,但尚未發(fā)送)。原型為:inttcflush(intfd,intqueue_selector)queue_selector數(shù)應(yīng)當(dāng)是下列三個數(shù)之一:TCIFLUSH——丟棄驅(qū)動上已經(jīng)接收到但還沒讀入的所有數(shù)據(jù)TCOFLUSH——丟棄所有已經(jīng)寫入驅(qū)動但還沒發(fā)送的數(shù)據(jù)TCIOFLUSH——丟棄所有輸入輸出隊列上還沒有讀取或發(fā)送的數(shù)據(jù)21/30tcflush(fd,TCIFLUSH);讀寫串口5、設(shè)置好串口之后,讀寫串口就很容易了,可以把串口當(dāng)作文件讀寫發(fā)送數(shù)據(jù):charbuffer[1024];intLength=1024;intnByte;nByte=write(fd,buffer,Length)22/30讀取串口數(shù)據(jù)使用文件操作read函數(shù)讀取,如果設(shè)置為原始模式(RawMode)傳輸數(shù)據(jù),那么read函數(shù)返回的字符數(shù)是實際串口收到的字符數(shù)。charbuff[1024];intLen=1024;intreadByte=read(fd,buff,Len);23/30關(guān)閉串口6、關(guān)閉串口close()
例如:tcsetattr(fd,TCSANOW,&oldtio);close(fd);24/30提示注意:如果在執(zhí)行./term時出現(xiàn)下面的錯誤,可以通過我們前文提到的方法建立一個連接來解決。[/mnt/yaffs]cd/dev[/dev]ln–sf/dev/tts/0ttyS025/30261.波特率設(shè)置獲得端口波特率信息是通過cfgetispeed函數(shù)和cfgetospeed函數(shù)來實現(xiàn)的。cfgetispeed函數(shù)用于獲得結(jié)構(gòu)體termios_p中的輸入波特率信息,而cfgetospeed函數(shù)用于獲得結(jié)構(gòu)體termios_p中的輸出波特率信息。這兩個函數(shù)的具體信息如下表所示。其他串口設(shè)置參考271.波特率設(shè)置cfsetispeed函數(shù)和cfsetospeed函數(shù)會修改結(jié)構(gòu)體termios_p中的波特率信息,其中參數(shù)speed可以使用下表中所列出的宏。speed參數(shù)常用波特率信息其他串口設(shè)置參考282.?dāng)?shù)據(jù)位數(shù)據(jù)位指的是每字節(jié)中實際數(shù)據(jù)所占的比特數(shù)。要修改數(shù)據(jù)位可以通過修改termios結(jié)構(gòu)體中c_cflag成員來實現(xiàn)。CS5、CS6、CS7和CS8分別表示數(shù)據(jù)位為5、6、7和8。值得注意的是,在設(shè)置數(shù)據(jù)位時,必須先使用CSIZE做位屏蔽。Eg:structtermiosopt;
/*定義指向termios結(jié)構(gòu)類型的指針opt*/
//獲得串口指向termios結(jié)構(gòu)的指針
tcgetattr(fd,&Opt);//屏蔽其他標(biāo)志
Opt.c_cflag&=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030歐洲智能機器人操作系統(tǒng)市場競爭態(tài)勢發(fā)展現(xiàn)狀投資評估規(guī)劃分析報告
- 2025-2030歐洲智能建筑控制系統(tǒng)行業(yè)市場現(xiàn)狀分析發(fā)展趨勢研究報告
- 2025-2030歐洲教育文化行業(yè)市場現(xiàn)詳細(xì)調(diào)研與商業(yè)前景發(fā)展趨勢分析
- 2026安徽淮南市壽縣楚通公共交通有限公司就業(yè)見習(xí)招聘2人備考題庫有完整答案詳解
- 2026江西職業(yè)技術(shù)大學(xué)高層次人才招聘74人備考題庫(4)及一套參考答案詳解
- 2026河南中原資源循環(huán)科技(河南)有限公司招聘17名備考題庫及1套完整答案詳解
- 2026中國電子科技集團(tuán)公司第三十三研究所招聘備考題庫及完整答案詳解1套
- 2025年陜西省動物研究所招聘備考題庫及1套參考答案詳解
- 2025廣西柳州市林業(yè)科學(xué)研究所招聘編外聘用人員1人備考題庫完整參考答案詳解
- 2026年1月云南麗江市消防救援支隊招錄政府專職消防員4人備考題庫及答案詳解參考
- 【語文】湖南省長沙市實驗小學(xué)小學(xué)四年級上冊期末試卷(含答案)
- 阿米巴經(jīng)營模式-人人都是經(jīng)營者推行授課講義課件
- 小兒鞘膜積液
- 畢業(yè)設(shè)計粘土心墻土石壩設(shè)計含計算書cad圖
- 黑龍江省控制性詳細(xì)規(guī)劃編制規(guī)范
- 6工程竣工驗收交付證明書
- 《俠客風(fēng)云傳前傳》支線流程攻略1.0.2.4
- GB/T 38937-2020鋼筋混凝土用鋼術(shù)語
- GB/T 12325-2008電能質(zhì)量供電電壓偏差
- 《抖音短視頻營銷存在的問題及對策10000字》
- 讀后續(xù)寫練習(xí)指導(dǎo) 講義(附試題分析及范文3篇)-2023高考英語二輪復(fù)習(xí)寫作備考
評論
0/150
提交評論