版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、實驗十二 串口通訊實驗【實驗目的】1、了解串口設備文件系統(tǒng)的使用方法;2、掌握Qt編程方法與技巧3、掌握Qtopia應用程序的配置過程【實驗原理】在Linux操作系統(tǒng)中對底層終端的處理是一個非常復雜的過程,需要處理許多不同類型的設備(包括調制解調器、終端仿真、偽終端等)。Linux系統(tǒng)處理終端的方法是通過串行接口連接的控制臺與系統(tǒng)通信并運行程序。由于越來越多的廠商都參與終端的生產(chǎn),而且每個廠商都是為自己的終端設計自己的命令集,所以需要有一種方法對終端的訪問進行一般化處理。Linux系統(tǒng)使用一個能力數(shù)據(jù)庫terminfo來描述每個終端的能力以及調用這些功能的方法。1、終端控制函數(shù)介紹在對底層終端
2、操作中有一個用于查詢和操作終端的標準接口結構體 termios,該結構體對終端的輸入、輸出、硬件特性、控制協(xié)議等方面進行了定義,具體定義形式如下:struct termios tcflag_t c_iflag; tcflag_t c_oflag; tcflag_t c_cflag; tcflag_t c_lflag; cc_t;cc_t c_ccNCCS;其中參數(shù)c_iflag用來控制輸入處理選項;c_oflag控制輸出數(shù)據(jù)的處理;c_cflag設置決定終端硬件特性的控制標志;c_lflag存放本地模式標志,用來操縱終端特性;c_line表示控制協(xié)議;c_cc包含特殊字符序列的值以及它們所代表
3、的操作。終端有兩種工作模式,分別為規(guī)范模式(或稱為cooked模式)和非規(guī)范模式(或稱為原始模式)。在規(guī)范模式下,終端設備驅動程序處理特殊字符并以一次一行的方式將輸入發(fā)送給程序使用,而在非規(guī)范模式下,大多數(shù)鍵盤輸入得不到處理,也不緩存。(1)、終端屬性控制函數(shù)對終端的操作主要通過屬性設置函數(shù)tcsetattr()和屬性獲取函數(shù)tcgetattr()來實現(xiàn)。其中tcsetattr()函數(shù)用來初始化一個termios數(shù)據(jù)結構,并設置用來表示該終端特性和設置的屬性值,tcgetattr()獲取和查詢終端屬性的數(shù)據(jù)結構,當改變操作完成后,通過使用tcsetattr()函數(shù)將用到的新值更新終端。tcse
4、tattr()和tcgetattr()的調用形式如下:int tcsetattr(int fd, int action , struct termios *tp)函數(shù)tcsetattr()使用由tp引用的termios數(shù)據(jù)結構來設置與文件描述符fd相關聯(lián)的終端參數(shù),參數(shù)action控制設置參數(shù)什么時候發(fā)生改變,如果取TASANOW表示立即改變所設參數(shù)屬性;如果取TCSADRAIN表示fd上的輸出已經(jīng)發(fā)送到終端后才改變所設置的參數(shù)屬性;如果取TCSAFLUSH表示fd上的輸出完全被發(fā)送到終端后,任何掛起的輸入將被丟棄。int tcgetattr(int fd , struct termios *
5、tp)查詢和文件描述符相關聯(lián)的終端參數(shù),并將參數(shù)存儲到由tp所引用的termios數(shù)據(jù)結構體中,調用成功返回0,發(fā)生錯誤返回-1。(2)、終端速度控制函數(shù)終端速度控制函數(shù)用來設置終端設備的輸入、輸出速度,速度以波特率來定義。這些函數(shù)都是成對出現(xiàn),其中的兩個用來獲取和設置輸入的速度,另兩個用來獲取和設置輸出線路的速度,它們定義形式如下:int cfgetispeed (struct termios *tp) int cfsetispeed (struct termios *tp , speed_t speed)int cfgetospeed (struct termios *tp) int cf
6、setospeed (struct termios *tp , speed_t speed)其中函數(shù)cfgetispeed()返回由tp指針指向的termios數(shù)據(jù)結構中所存儲的輸入線路速度值。函數(shù)cfsetispeed()將由tp指針指向的termios數(shù)據(jù)結構中存儲的輸入線路速度設置為speed。函數(shù)cfgetospeed()返回由tp指針指向的termios數(shù)據(jù)結構中所存儲的輸出線路速度值。函數(shù)cfsetospeed()將由tp指針指向的termios數(shù)據(jù)結構中存儲的輸出線路速度設置為speed。以上四個函數(shù)調用成功則返回0,發(fā)生錯誤則返回-1(3)、行控制函數(shù)行控制函數(shù)是用來查詢和設置
7、各種與數(shù)據(jù)操作方式、時間等相關的特征。它們的定義如下:int tcdrain(int fd)int tcflush(int fd , int queue)int tcflow (int fd , int action)其中函數(shù)tcdrain()將使所有掛起的輸出操作完成,并將一直保持等待,直到所有輸出都已經(jīng)寫到文件描述字fd指向的文件為止。而函數(shù)tcflush()將刷新最新排在文件描述字fd隊列中的輸入和輸出。參數(shù)queue用來指定要刷新的數(shù)據(jù),如果queue取值為TCIFUSH,刷新接收到但尚未讀取的輸入數(shù)據(jù);如果取值為TCOFLUSH,刷新被改寫但尚未傳送的輸出數(shù)據(jù);如查取值為TCILFL
8、USH,則兩者都刷新。函數(shù)tcflow()是流量控制函數(shù),用來啟動或停止對文件描述字fd的數(shù)據(jù)傳送和接收,參數(shù)action如果為TCOON,表示啟動輸出,為TCOOFF時表示停止輸出;為TCION時啟動輸入;為TCIOFF時停止輸入。2、串口通信類的封裝在Qt開發(fā)軟件中,沒有專門用于對終端設備進行操作的類或控件,為了對終端設備進行操作,一種方法就是利用Linux底層終端函數(shù)直接在應用程序中對終端設備進行編程操作,但這樣編程比較麻煩,而且無法實現(xiàn)代碼重用。另一種方法就是將終端設備的操作函數(shù)封裝成類的形式,這樣不僅編程方便而且可以實現(xiàn)代碼重用。下面具體介紹串口類的封裝。在對串口進行編程操作時,可能
9、涉及到打開串口,設置串口參數(shù)、讀取串口數(shù)據(jù)、向串口寫數(shù)據(jù)及關閉串口等操作函數(shù),因此在封裝串口類時,必須具有以上幾個操作函數(shù)。另外,希望在應用程序退出后不改變串口原參數(shù),應對原參數(shù)進行保存,待關閉串口時恢復串口原參數(shù)。串口類的具體實現(xiàn)函數(shù)(1)、打開串口函數(shù),返回操作標志int Serial:OpenSerialPort(const char *port)int fd=:open( port, O_RDWR | O_NOCTTY ,O_NONBLOCK); if ( fd0)return -1;/打開失敗fcntl(fd, F_SETFL,FNDELAY);tcgetattr(fd , &ter
10、mios_old);/將原來串口參數(shù)保存到termios_old結構體中return fd;/返回成功操作標志(2)、關閉串口子程序,返回操作標志void Serial:CloseSerialPort(int serialfd)tcsetattr (serialfd, TCSADRAIN, &termios_old);/恢復串口參數(shù)int fd =:close (serialfd);/關閉串口return fd; /返回操作標志(3)、向串口寫數(shù)據(jù),返回寫入串口的總長度int Serial:WriteSerialPort (int serialfd , const char *data, in
11、t datalength)int len, total_len;/定義寫入長度和總長度變量for (total_len = 0 ; total_len 0) total_len += len;elsetcflush (serialfd, TCOFLUSH); break;return (total_len);/返回總長度(4)、設置串口參數(shù),主要設置數(shù)據(jù)位、停止位、奇偶校驗位、速度、超時設置等參數(shù),返回操作標志。int Serial:SetSerialPara(int serialfd ,int databits , int stopbits ,char parity, int speed ,
12、 int vtime) bzero( &termios_new, sizeof(termios_new);/對新結構體termios_new清空 cfmakeraw(&termios_new); termios_new.c_cflag= speed;/設置串口波特率 termios_new.c_cflag |= CLOCAL | CREAD; termios_new.c_cflag &= CSIZE;switch (databits) /設置數(shù)據(jù)位 case 8:termios_new.c_cflag |= CS8; break; case 7:termios_new.c_cflag |= C
13、S7; break; case 6:termios_new.c_cflag |= CS6; break; case 5:termios_new.c_cflag |= CS5; break; default:termios_new.c_cflag |= CS8; break;switch (parity) /設置奇偶校驗 case N: termios_new.c_cflag &= PARENB; break; case E:termios_new.c_cflag |= PARENB; termios_new.c_cflag &= PARODD; break; case O:termios_ne
14、w.c_cflag |= PARENB; termios_new.c_cflag |= PARODD; break; default:termios_new.c_cflag &= PARENB; break; switch (stopbits)/ 設置停止位 case 1:termios_new.c_cflag &= CSTOPB; break; case 2:termios_new.c_cflag |= CSTOPB; break; default:termios_new.c_cflag &= CSTOPB; break; termios_new.c_ccVTIME = vtime; /設置
15、超時時間 termios_new.c_ccVMIN = 0; tcflush (serialfd, TCIFLUSH);return tcsetattr(serialfd,TCSANOW,&termios_new); /立即更新設置參數(shù) (5)、讀取串口數(shù)據(jù)因為Linux操作系統(tǒng)采用一種特殊的設備文件系統(tǒng)devfs,使設備作為一種文件存在,因此讀取設備數(shù)據(jù)同讀取一般文件的方法相同,為了靈活使用已封裝好的串口類,因此在封裝串口類時,將讀取串口數(shù)據(jù)的函數(shù)放在串口類外面,便于用戶控制。讀取串口數(shù)據(jù)的函數(shù)采用Linux底層函數(shù)read()進行操作,調用方法如下:int read (int fd, ch
16、ar *, int length )其中fd為設備號;char *為數(shù)據(jù)緩沖區(qū);length每次讀取數(shù)據(jù)的長度;返回值為實際讀取數(shù)據(jù)的長度。3、串口通信源代碼的編譯(1)PC平臺的串口通信程序編譯l 將光盤提供的serialpc的源代碼復制到硬盤中(假設將源碼復制在/root/work目錄下)l 對源碼進行編譯rootwork$cd serialpcrootserialpc$makel 在PC機上運行serial程序,運行界面如圖12-1所示rootserialpc$./serial(2)、ARM平臺的串口通信程序的編譯l 將光盤提供的serialarm的源代碼復制到硬盤中(假設將源碼復制在/
17、root/work目錄下)l 設置交叉編譯工具參數(shù)(arm-linux-g+)l 修改Makefile文件修改LIBS = -L/usr/local/opencvlib_arm -lcxcore -lcv -lhighgui -lcvaux -ltsl 對源代碼進行編譯rootwork$cd serialarmrootworkexport QTDIR=/work/qt-2.3.7rootworkexport QPEDIR=/work/qtopia-1.7.0rootworkexport LD_LIBRARY_PATH=/work/qt-2.3.7/lib:$LD_LIBRARY_PATHroo
18、tworkexport TMAKEDIR=/work/tmake-1.11rootworkexport TMAKEPATH=/work/tmake-1.11/lib/qws/linux-arm-g+rootworkexport PATH=/work/tmake-1.11/bin:$PATHrootserialarm$makel 將編譯好的程序serial下載到開發(fā)板的/usr/qpe/bin目錄下l 在目標板上利用chmod命令修改serial的屬性rootbin$ chmod 755 seriall 在開發(fā)板的/usr/qpe/application目錄下新建serial.desktop文件(內(nèi)容如下),或將serialarm目錄下的serialarm.desktop文
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年消防給水系統(tǒng)工程保險合同3篇
- 2025年消防安裝勞務分包施工合同(含消防檢測)3篇
- 2025年保密協(xié)議保密責任
- 2025年度龍門吊拆除項目安全風險評估與應急預案合同4篇
- 2025年勵志類書籍發(fā)行協(xié)議
- 2025年倉庫租金遞增約定協(xié)議
- 2025年倉儲倉庫保全合同
- 2025年人才匹配與協(xié)議書范本
- 二零二五年貨車租賃及貨運信息處理服務合同3篇
- 2025年消防工程勞務分包及消防安全評估合同3篇
- 2024版智慧電力解決方案(智能電網(wǎng)解決方案)
- 公司SWOT分析表模板
- 小學預防流行性感冒應急預案
- 肺癌術后出血的觀察及護理
- 生物醫(yī)藥大數(shù)據(jù)分析平臺建設-第1篇
- 基于Android的天氣預報系統(tǒng)的設計與實現(xiàn)
- 沖鋒舟駕駛培訓課件
- 美術家協(xié)會會員申請表
- 聚合收款服務流程
- 中石化浙江石油分公司中石化溫州靈昆油庫及配套工程項目環(huán)境影響報告書
- 搞笑朗誦我愛上班臺詞
評論
0/150
提交評論