實(shí)驗(yàn)十二 串口通訊實(shí)驗(yàn)_第1頁
實(shí)驗(yàn)十二 串口通訊實(shí)驗(yàn)_第2頁
實(shí)驗(yàn)十二 串口通訊實(shí)驗(yàn)_第3頁
實(shí)驗(yàn)十二 串口通訊實(shí)驗(yàn)_第4頁
實(shí)驗(yàn)十二 串口通訊實(shí)驗(yàn)_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、實(shí)驗(yàn)十二 串口通訊實(shí)驗(yàn)【實(shí)驗(yàn)?zāi)康摹?、了解串口設(shè)備文件系統(tǒng)的使用方法;2、掌握Qt編程方法與技巧3、掌握Qtopia應(yīng)用程序的配置過程【實(shí)驗(yàn)原理】在Linux操作系統(tǒng)中對底層終端的處理是一個非常復(fù)雜的過程,需要處理許多不同類型的設(shè)備(包括調(diào)制解調(diào)器、終端仿真、偽終端等)。Linux系統(tǒng)處理終端的方法是通過串行接口連接的控制臺與系統(tǒng)通信并運(yùn)行程序。由于越來越多的廠商都參與終端的生產(chǎn),而且每個廠商都是為自己的終端設(shè)計(jì)自己的命令集,所以需要有一種方法對終端的訪問進(jìn)行一般化處理。Linux系統(tǒng)使用一個能力數(shù)據(jù)庫terminfo來描述每個終端的能力以及調(diào)用這些功能的方法。1、終端控制函數(shù)介紹在對底層終端

2、操作中有一個用于查詢和操作終端的標(biāo)準(zhǔn)接口結(jié)構(gòu)體 termios,該結(jié)構(gòu)體對終端的輸入、輸出、硬件特性、控制協(xié)議等方面進(jìn)行了定義,具體定義形式如下: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用來控制輸入處理選項(xiàng);c_oflag控制輸出數(shù)據(jù)的處理;c_cflag設(shè)置決定終端硬件特性的控制標(biāo)志;c_lflag存放本地模式標(biāo)志,用來操縱終端特性;c_line表示控制協(xié)議;c_cc包含特殊字符序列的值以及它們所代表

3、的操作。終端有兩種工作模式,分別為規(guī)范模式(或稱為cooked模式)和非規(guī)范模式(或稱為原始模式)。在規(guī)范模式下,終端設(shè)備驅(qū)動程序處理特殊字符并以一次一行的方式將輸入發(fā)送給程序使用,而在非規(guī)范模式下,大多數(shù)鍵盤輸入得不到處理,也不緩存。(1)、終端屬性控制函數(shù)對終端的操作主要通過屬性設(shè)置函數(shù)tcsetattr()和屬性獲取函數(shù)tcgetattr()來實(shí)現(xiàn)。其中tcsetattr()函數(shù)用來初始化一個termios數(shù)據(jù)結(jié)構(gòu),并設(shè)置用來表示該終端特性和設(shè)置的屬性值,tcgetattr()獲取和查詢終端屬性的數(shù)據(jù)結(jié)構(gòu),當(dāng)改變操作完成后,通過使用tcsetattr()函數(shù)將用到的新值更新終端。tcse

4、tattr()和tcgetattr()的調(diào)用形式如下:int tcsetattr(int fd, int action , struct termios *tp)函數(shù)tcsetattr()使用由tp引用的termios數(shù)據(jù)結(jié)構(gòu)來設(shè)置與文件描述符fd相關(guān)聯(lián)的終端參數(shù),參數(shù)action控制設(shè)置參數(shù)什么時候發(fā)生改變,如果取TASANOW表示立即改變所設(shè)參數(shù)屬性;如果取TCSADRAIN表示fd上的輸出已經(jīng)發(fā)送到終端后才改變所設(shè)置的參數(shù)屬性;如果取TCSAFLUSH表示fd上的輸出完全被發(fā)送到終端后,任何掛起的輸入將被丟棄。int tcgetattr(int fd , struct termios *

5、tp)查詢和文件描述符相關(guān)聯(lián)的終端參數(shù),并將參數(shù)存儲到由tp所引用的termios數(shù)據(jù)結(jié)構(gòu)體中,調(diào)用成功返回0,發(fā)生錯誤返回-1。(2)、終端速度控制函數(shù)終端速度控制函數(shù)用來設(shè)置終端設(shè)備的輸入、輸出速度,速度以波特率來定義。這些函數(shù)都是成對出現(xiàn),其中的兩個用來獲取和設(shè)置輸入的速度,另兩個用來獲取和設(shè)置輸出線路的速度,它們定義形式如下: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ù)結(jié)構(gòu)中所存儲的輸入線路速度值。函數(shù)cfsetispeed()將由tp指針指向的termios數(shù)據(jù)結(jié)構(gòu)中存儲的輸入線路速度設(shè)置為speed。函數(shù)cfgetospeed()返回由tp指針指向的termios數(shù)據(jù)結(jié)構(gòu)中所存儲的輸出線路速度值。函數(shù)cfsetospeed()將由tp指針指向的termios數(shù)據(jù)結(jié)構(gòu)中存儲的輸出線路速度設(shè)置為speed。以上四個函數(shù)調(diào)用成功則返回0,發(fā)生錯誤則返回-1(3)、行控制函數(shù)行控制函數(shù)是用來查詢和設(shè)置

7、各種與數(shù)據(jù)操作方式、時間等相關(guān)的特征。它們的定義如下:int tcdrain(int fd)int tcflush(int fd , int queue)int tcflow (int fd , int action)其中函數(shù)tcdrain()將使所有掛起的輸出操作完成,并將一直保持等待,直到所有輸出都已經(jīng)寫到文件描述字fd指向的文件為止。而函數(shù)tcflush()將刷新最新排在文件描述字fd隊(duì)列中的輸入和輸出。參數(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ā)軟件中,沒有專門用于對終端設(shè)備進(jìn)行操作的類或控件,為了對終端設(shè)備進(jìn)行操作,一種方法就是利用Linux底層終端函數(shù)直接在應(yīng)用程序中對終端設(shè)備進(jìn)行編程操作,但這樣編程比較麻煩,而且無法實(shí)現(xiàn)代碼重用。另一種方法就是將終端設(shè)備的操作函數(shù)封裝成類的形式,這樣不僅編程方便而且可以實(shí)現(xiàn)代碼重用。下面具體介紹串口類的封裝。在對串口進(jìn)行編程操作時,可能

9、涉及到打開串口,設(shè)置串口參數(shù)、讀取串口數(shù)據(jù)、向串口寫數(shù)據(jù)及關(guān)閉串口等操作函數(shù),因此在封裝串口類時,必須具有以上幾個操作函數(shù)。另外,希望在應(yīng)用程序退出后不改變串口原參數(shù),應(yīng)對原參數(shù)進(jìn)行保存,待關(guān)閉串口時恢復(fù)串口原參數(shù)。串口類的具體實(shí)現(xiàn)函數(shù)(1)、打開串口函數(shù),返回操作標(biāo)志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結(jié)構(gòu)體中return fd;/返回成功操作標(biāo)志(2)、關(guān)閉串口子程序,返回操作標(biāo)志void Serial:CloseSerialPort(int serialfd)tcsetattr (serialfd, TCSADRAIN, &termios_old);/恢復(fù)串口參數(shù)int fd =:close (serialfd);/關(guān)閉串口return fd; /返回操作標(biāo)志(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ù),主要設(shè)置數(shù)據(jù)位、停止位、奇偶校驗(yàn)位、速度、超時設(shè)置等參數(shù),返回操作標(biāo)志。int Serial:SetSerialPara(int serialfd ,int databits , int stopbits ,char parity, int speed ,

12、 int vtime) bzero( &termios_new, sizeof(termios_new);/對新結(jié)構(gòu)體termios_new清空 cfmakeraw(&termios_new); termios_new.c_cflag= speed;/設(shè)置串口波特率 termios_new.c_cflag |= CLOCAL | CREAD; termios_new.c_cflag &= CSIZE;switch (databits) /設(shè)置數(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) /設(shè)置奇偶校驗(yàn) 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)/ 設(shè)置停止位 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; /設(shè)置

15、超時時間 termios_new.c_ccVMIN = 0; tcflush (serialfd, TCIFLUSH);return tcsetattr(serialfd,TCSANOW,&termios_new); /立即更新設(shè)置參數(shù) (5)、讀取串口數(shù)據(jù)因?yàn)長inux操作系統(tǒng)采用一種特殊的設(shè)備文件系統(tǒng)devfs,使設(shè)備作為一種文件存在,因此讀取設(shè)備數(shù)據(jù)同讀取一般文件的方法相同,為了靈活使用已封裝好的串口類,因此在封裝串口類時,將讀取串口數(shù)據(jù)的函數(shù)放在串口類外面,便于用戶控制。讀取串口數(shù)據(jù)的函數(shù)采用Linux底層函數(shù)read()進(jìn)行操作,調(diào)用方法如下:int read (int fd, ch

16、ar *, int length )其中fd為設(shè)備號;char *為數(shù)據(jù)緩沖區(qū);length每次讀取數(shù)據(jù)的長度;返回值為實(shí)際讀取數(shù)據(jù)的長度。3、串口通信源代碼的編譯(1)PC平臺的串口通信程序編譯l 將光盤提供的serialpc的源代碼復(fù)制到硬盤中(假設(shè)將源碼復(fù)制在/root/work目錄下)l 對源碼進(jìn)行編譯rootwork$cd serialpcrootserialpc$makel 在PC機(jī)上運(yùn)行serial程序,運(yùn)行界面如圖12-1所示rootserialpc$./serial(2)、ARM平臺的串口通信程序的編譯l 將光盤提供的serialarm的源代碼復(fù)制到硬盤中(假設(shè)將源碼復(fù)制在/

17、root/work目錄下)l 設(shè)置交叉編譯工具參數(shù)(arm-linux-g+)l 修改Makefile文件修改LIBS = -L/usr/local/opencvlib_arm -lcxcore -lcv -lhighgui -lcvaux -ltsl 對源代碼進(jìn)行編譯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 在目標(biāo)板上利用chmod命令修改serial的屬性rootbin$ chmod 755 seriall 在開發(fā)板的/usr/qpe/application目錄下新建serial.desktop文件(內(nèi)容如下),或?qū)erialarm目錄下的serialarm.desktop文

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論