




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1嵌入式系統(tǒng)第8講ARM-Linux串口通信程序設(shè)計(jì)串行通信方式每次傳送一個(gè)bit的通信方式,字符被分成一串bits來傳輸。串行數(shù)據(jù)的速度通常用每秒傳輸?shù)淖止?jié)數(shù)bits-per-second(bps)或者波特率(baud)表示。串口設(shè)備計(jì)算機(jī)發(fā)展歷史中,串口廣泛用于連接外設(shè);雖然速度慢,卻現(xiàn)在仍然廣泛使用某些計(jì)算機(jī)使用稱為UART(UniversalAsynchronousReceiver/Transmitter,通用異步接收/發(fā)送裝置)的集成電路來作為串口設(shè)備。它完成計(jì)算機(jī)內(nèi)并行數(shù)據(jù)和設(shè)備端口串行數(shù)據(jù)的轉(zhuǎn)換(輸入輸出FIFO);并且可以自動(dòng)地處理數(shù)據(jù)的時(shí)序。而某些低端設(shè)備則會(huì)讓CPU直接來傳送數(shù)據(jù)。RS-232RS-232是EIA(ElectronicIndustriesAssociation)定義的串行通信的電器接口.分為DB-9和DB-25兩種接口。DB-9定義RS-232DB-25定義串行異步通信格式異步模式:空閑時(shí)串口一直是1;當(dāng)有數(shù)據(jù)時(shí),總是以一個(gè)start位開始,start位是0;串口隨時(shí)可進(jìn)行傳輸,不需時(shí)鐘也不用定義同步幀頭幀尾,故稱異步通信在start(0)之后,字符編碼可以是7bits或者8bits之后可能有parity奇偶校驗(yàn)位和stop停止位(1,1.5或者2bits)所以通常用8-N-1、7-E-1等方式來描述流控兩個(gè)串口設(shè)備之間,可能因?yàn)殒溌凡町惖仍?,需要進(jìn)行數(shù)據(jù)流的協(xié)調(diào),一般兩種方法:軟件流控:以XON(八進(jìn)制021)標(biāo)示開始,以XOFF(八進(jìn)制023)標(biāo)示結(jié)束硬件流控:RTS(發(fā)送方準(zhǔn)備好發(fā)出ReadytoSend)和CTS(接收方準(zhǔn)備好發(fā)出CleartoSent)握手信號(hào)Linux下訪問串口設(shè)備文件Linux下設(shè)備是以設(shè)備文件方式來訪問的,串口也是如此。在linux系統(tǒng)下面,每一個(gè)串口設(shè)備都有設(shè)備文件與其關(guān)聯(lián),設(shè)備文件位于系統(tǒng)的/dev目錄下面。如linux下的/ttyS0,/ttyS1分別表示的是串口1和串口2。頭文件#include<stdio.h>/*標(biāo)準(zhǔn)輸入輸出定義*/#include<stdlib.h>/*標(biāo)準(zhǔn)函數(shù)庫定義*/#include<unistd.h>/*Unix標(biāo)準(zhǔn)函數(shù)定義*/#include<sys/types.h>/*數(shù)據(jù)類型定義*/#include<sys/stat.h>/*文件屬性定義*/#include<fcntl.h>/*文件控制定義*/#include<termios.h>/*POSIX終端控制定義*/#include<errno.h>/*錯(cuò)誤號(hào)定義*/#include<string.h>/*字符串功能函數(shù)*/串口程序相關(guān)函數(shù)串口參數(shù)設(shè)定和文件操作的幾個(gè)重要函數(shù)函數(shù)名描述舉例open打開串口文件open("/dev/ttyS0",O_RDWR)tcgetattr保存當(dāng)前串口設(shè)置tcgetattr(fd,&oldtio)tcsetattr設(shè)置串口參數(shù)tcsetattr(fd,TCSANOW,&newtio)read從串口中讀數(shù)據(jù)read(fd,buff,Len)tcflush清除串口緩沖區(qū)tcflush(fd,TCIFLUSH);write向串口中寫數(shù)據(jù)write(fd,buffer,Length)close關(guān)閉串口文件close(fd);打開串口intopen(“DE_name”,intopen_Status)參數(shù)說明:(1).DE_name:要打開的設(shè)備文件名比如要打開串口1,即為/dev/ttyS0。(2).open_Status:文件打開方式,可采用下面的文件打開模式;函數(shù)返回值:成功返回文件描述符,如果失敗返回-1參數(shù)說明O_RDONLY以只讀方式打開文件O_WRONLY以只寫方式打開文件O_RDWR以讀寫方式打開文件O_APPEND寫入數(shù)據(jù)時(shí)添加到文件末尾O_CREATE如果文件不存在則產(chǎn)生該文件,使用該標(biāo)志需要設(shè)置訪問權(quán)限位mode_tO_EXCL指定該標(biāo)志,并且指定了O_CREATE標(biāo)志,如果打開的文件存在則會(huì)產(chǎn)生一個(gè)錯(cuò)誤O_TRUNC如果文件存在并且成功以寫或者只寫方式打開,則清除文件所有內(nèi)容,使得文件長度變?yōu)?O_NOCTTY如果打開的是一個(gè)終端設(shè)備,這個(gè)程序不會(huì)成為對(duì)應(yīng)這個(gè)端口的控制終端,如果沒有該標(biāo)志,任何一個(gè)輸入,都將影響進(jìn)程。O_NONBLOCK如果指定該標(biāo)志,進(jìn)程將一直在休眠狀態(tài),直到DCD信號(hào)線為0intfd;/*文件描述符*/fd=open("/dev/ttyS0",O_RDWR|0_NOCTTY);/*以讀寫方式打開設(shè)備*/if(fd==-1)perror("openttyS0/n!");/*打開失敗時(shí)的錯(cuò)誤提示*/close(fd);參數(shù)說明:fd:文件描述符函數(shù)返回值:成功返回0,失敗返回-1。關(guān)閉串口串口配置與終端標(biāo)準(zhǔn)結(jié)構(gòu)體配置串口主要通過tcgetattr()和tcsetattr()這兩個(gè)函數(shù)。他們均使用一個(gè)結(jié)構(gòu)體,該結(jié)構(gòu)體對(duì)終端的輸入、輸出、硬件特性、控制協(xié)議等方面進(jìn)行了定義,具體定義形式如下:structtermios{
tcflag_t c_iflag;輸入?yún)?shù) tcflag_t c_oflag;輸出參數(shù) tcflag_t c_cflag;控制參數(shù) tcflag_t c_lflag;本地模式 cc_t c_line;行控制 cc_t c_cc[NCCS];控制字符};終端標(biāo)準(zhǔn)結(jié)構(gòu)體說明其中參數(shù):c_iflag輸入?yún)?shù)設(shè)置;c_oflag輸出參數(shù)設(shè)置;c_cflag設(shè)置決定終端硬件特性的控制標(biāo)志,包括數(shù)據(jù)位寬度、停止位、奇偶校驗(yàn)位等c_lflag存放本地模式(與用戶交互)設(shè)置c_cc用來控制數(shù)據(jù)發(fā)送到調(diào)用程序的方式輸入選項(xiàng)c_iflag注:NL=newline輸出選項(xiàng)c_oflag控制選項(xiàng)c_cflagc_lflagc_ccCflag設(shè)置舉例Noparity(8N1) options.c_cflag&=~PARENB;//關(guān)閉校驗(yàn) options.c_cflag&=~CSTOPB;//設(shè)置停止位 options.c_cflag&=~CSIZE;//設(shè)置數(shù)據(jù)位 options.c_cflag|=CS8;Evenparity(7E1) options.c_cflag|=PARENB;//開啟校驗(yàn) options.c_cflag&=~PARODD;//偶校驗(yàn)?zāi)J?options.c_cflag&=~CSTOPB; options.c_cflag&=~CSIZE; options.c_cflag|=CS7;串口設(shè)置函數(shù)tcsetattrinttcsetattr(intfd,intopt_DE,*ptr)該函數(shù)用來設(shè)置終端控制屬性,其參數(shù)說明如下:
fd:待操作的文件描述符
opt_DE:選項(xiàng)值,有三個(gè)選項(xiàng)以供選擇:
TCSANOW:不等數(shù)據(jù)傳輸完畢就立即改變屬性
TCSADRAIN:等待所有數(shù)據(jù)傳輸結(jié)束才改變屬性
TCSAFLUSH:清空輸入輸出緩沖區(qū)才改變屬性
*ptr:指向termios結(jié)構(gòu)的指針函數(shù)返回值:成功返回0,失敗返回-1。tcgetattrinttcgetattr(intfd,*ptr)該函數(shù)用來獲取終端控制屬性,它把串口的默認(rèn)設(shè)置賦給了termios數(shù)據(jù)數(shù)據(jù)結(jié)構(gòu),其參數(shù)說明如下:
fd:待操作的文件描述符
*ptr:指向termios結(jié)構(gòu)的指針函數(shù)返回值:成功返回0,失敗返回-1。tcflushinttcflush(intfd,intquene)參數(shù)說明:quene取值及含義:*TCIFLUSH清除輸入隊(duì)列*TCOFLUSH清除輸出隊(duì)列*TCIOFLUSH清除輸入、輸出隊(duì)列舉例:tcflush(fd,TCIOFLUSH);另加的說明:在打開串口后,用戶其實(shí)已經(jīng)可以開始從串口讀取數(shù)據(jù)了,但如果用戶沒有讀取,數(shù)據(jù)將被將保存在緩沖區(qū)里。如果用戶不想要開始的一段數(shù)據(jù),或者發(fā)現(xiàn)緩沖區(qū)數(shù)據(jù)有誤,可以使用這個(gè)函數(shù)將緩沖區(qū)清空。應(yīng)用舉例:tcflush(fd,TCIOFLUSH);
sleep(2);
read_len=read(fd,buff,10);終端速度控制cfgetispeed,cfgetospeed,cfsetispeed,cfsetospeed獲取和設(shè)置輸入、輸出速度函數(shù):intcfgetispeed(structtermios*tp);intcfsetispeed(structtermios*tp,speed_tspeed);intcfgetospeed(structtermios*tp);
intcfsetospeed(structtermios*tp,speed_tspeed);速度定義波特率的設(shè)置定義在<asm/termbits.h>例如B4800------
4800B9600------
9600B19200-----
19200B38400------
38400B57600------
57600B115200-----
115200速度設(shè)置舉例#include<stdio.h>//頭文件定義........structtermiosopt;/*定義指向termios結(jié)構(gòu)類型的指針opt*/
cfsetispeed(&opt,B9600);/*指定輸入波特率,9600bps*/cfsetospeed(&opt,B9600);/*指定輸出波特率,9600bps*/讀操作串口讀操作read()(接收端)用open函數(shù)打開設(shè)備文件,函數(shù)返回一個(gè)文件描述符(filedescriptors,fd),通過文件描述符來訪問文件。函數(shù)原型如下:intread(intfd,*buffer,length);參數(shù)說明:(1).intfd:文件描述符(2).*buffer:數(shù)據(jù)緩沖區(qū)(3).length:要讀取的字節(jié)數(shù)函數(shù)返回值:讀操作成功讀取返回讀取的字節(jié)數(shù),失敗則返回-1。串口寫操作write()(發(fā)送端)函數(shù)原型如下:write(intfd,*buffer,length);參數(shù)說明:(1).fd:文件描述符(2).*buffer:存儲(chǔ)寫入數(shù)據(jù)的數(shù)據(jù)緩沖區(qū)(3).length:寫入緩沖去的數(shù)據(jù)字節(jié)數(shù)函數(shù)返回值:成
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 初中數(shù)學(xué)省級(jí)課題申報(bào)書
- 寧波課題立項(xiàng)申報(bào)書
- 生物小課題立項(xiàng)申報(bào)書
- 藝術(shù)規(guī)劃課題申報(bào)書范本
- 風(fēng)濕課題申報(bào)書
- 賣車位定金合同范本
- 行為習(xí)慣養(yǎng)成課題申報(bào)書
- 合同范本文化傳播
- 課題成果申報(bào)書范文
- 精準(zhǔn)教學(xué) 課題申報(bào)書
- 幕墻工程作業(yè)活動(dòng)風(fēng)險(xiǎn)分級(jí)管控清單
- 【海馬汽車企業(yè)營運(yùn)能力問題及解決策略(論文10000字)】
- 永安電力股份有限公司三臺(tái)縣凱河110千伏輸變電新建工程環(huán)評(píng)報(bào)告
- 人體解剖生理學(xué)教案
- 減少噪音保護(hù)聽力
- 網(wǎng)絡(luò)安全技術(shù)與應(yīng)用PPT完整全套教學(xué)課件
- 巖石力學(xué)與工程課后習(xí)題與思考解答
- 《民族樂器分類二》教案
- API520-安全閥計(jì)算PART1(中文版)
- 本科畢設(shè)論文--企業(yè)vpn的接入規(guī)劃與設(shè)計(jì)
- 生產(chǎn)車間管理制度辦法
評(píng)論
0/150
提交評(píng)論