第8講 ARM-Linux串口通信程序設(shè)計(jì)_第1頁(yè)
第8講 ARM-Linux串口通信程序設(shè)計(jì)_第2頁(yè)
第8講 ARM-Linux串口通信程序設(shè)計(jì)_第3頁(yè)
第8講 ARM-Linux串口通信程序設(shè)計(jì)_第4頁(yè)
第8講 ARM-Linux串口通信程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩28頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1嵌入式系統(tǒng)第8講ARM-Linux串口通信程序設(shè)計(jì)串行通信方式每次傳送一個(gè)bit的通信方式,字符被分成一串bits來(lái)傳輸。串行數(shù)據(jù)的速度通常用每秒傳輸?shù)淖止?jié)數(shù)bits-per-second(bps)或者波特率(baud)表示。串口設(shè)備計(jì)算機(jī)發(fā)展歷史中,串口廣泛用于連接外設(shè);雖然速度慢,卻現(xiàn)在仍然廣泛使用某些計(jì)算機(jī)使用稱為UART(UniversalAsynchronousReceiver/Transmitter,通用異步接收/發(fā)送裝置)的集成電路來(lái)作為串口設(shè)備。它完成計(jì)算機(jī)內(nèi)并行數(shù)據(jù)和設(shè)備端口串行數(shù)據(jù)的轉(zhuǎn)換(輸入輸出FIFO);并且可以自動(dòng)地處理數(shù)據(jù)的時(shí)序。而某些低端設(shè)備則會(huì)讓CPU直接來(lái)傳送數(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位開(kāi)始,start位是0;串口隨時(shí)可進(jìn)行傳輸,不需時(shí)鐘也不用定義同步幀頭幀尾,故稱異步通信在start(0)之后,字符編碼可以是7bits或者8bits之后可能有parity奇偶校驗(yàn)位和stop停止位(1,1.5或者2bits)所以通常用8-N-1、7-E-1等方式來(lái)描述流控兩個(gè)串口設(shè)備之間,可能因?yàn)殒溌凡町惖仍?,需要進(jìn)行數(shù)據(jù)流的協(xié)調(diào),一般兩種方法:軟件流控:以XON(八進(jìn)制021)標(biāo)示開(kāi)始,以XOFF(八進(jìn)制023)標(biāo)示結(jié)束硬件流控:RTS(發(fā)送方準(zhǔn)備好發(fā)出ReadytoSend)和CTS(接收方準(zhǔn)備好發(fā)出CleartoSent)握手信號(hào)Linux下訪問(wèn)串口設(shè)備文件Linux下設(shè)備是以設(shè)備文件方式來(lái)訪問(wèn)的,串口也是如此。在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ù)庫(kù)定義*/#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打開(kāi)串口文件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向串口中寫(xiě)數(shù)據(jù)write(fd,buffer,Length)close關(guān)閉串口文件close(fd);打開(kāi)串口intopen(“DE_name”,intopen_Status)參數(shù)說(shuō)明:(1).DE_name:要打開(kāi)的設(shè)備文件名比如要打開(kāi)串口1,即為/dev/ttyS0。(2).open_Status:文件打開(kāi)方式,可采用下面的文件打開(kāi)模式;函數(shù)返回值:成功返回文件描述符,如果失敗返回-1參數(shù)說(shuō)明O_RDONLY以只讀方式打開(kāi)文件O_WRONLY以只寫(xiě)方式打開(kāi)文件O_RDWR以讀寫(xiě)方式打開(kāi)文件O_APPEND寫(xiě)入數(shù)據(jù)時(shí)添加到文件末尾O_CREATE如果文件不存在則產(chǎn)生該文件,使用該標(biāo)志需要設(shè)置訪問(wèn)權(quán)限位mode_tO_EXCL指定該標(biāo)志,并且指定了O_CREATE標(biāo)志,如果打開(kāi)的文件存在則會(huì)產(chǎn)生一個(gè)錯(cuò)誤O_TRUNC如果文件存在并且成功以寫(xiě)或者只寫(xiě)方式打開(kāi),則清除文件所有內(nèi)容,使得文件長(zhǎng)度變?yōu)?O_NOCTTY如果打開(kāi)的是一個(gè)終端設(shè)備,這個(gè)程序不會(huì)成為對(duì)應(yīng)這個(gè)端口的控制終端,如果沒(méi)有該標(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);/*以讀寫(xiě)方式打開(kāi)設(shè)備*/if(fd==-1)perror("openttyS0/n!");/*打開(kāi)失敗時(shí)的錯(cuò)誤提示*/close(fd);參數(shù)說(shuō)明:fd:文件描述符函數(shù)返回值:成功返回0,失敗返回-1。關(guān)閉串口串口配置與終端標(biāo)準(zhǔn)結(jié)構(gòu)體配置串口主要通過(guò)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)體說(shuō)明其中參數(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用來(lái)控制數(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;//開(kāi)啟校驗(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ù)用來(lái)設(shè)置終端控制屬性,其參數(shù)說(shuō)明如下:

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ù)用來(lái)獲取終端控制屬性,它把串口的默認(rèn)設(shè)置賦給了termios數(shù)據(jù)數(shù)據(jù)結(jié)構(gòu),其參數(shù)說(shuō)明如下:

fd:待操作的文件描述符

*ptr:指向termios結(jié)構(gòu)的指針函數(shù)返回值:成功返回0,失敗返回-1。tcflushinttcflush(intfd,intquene)參數(shù)說(shuō)明:quene取值及含義:*TCIFLUSH清除輸入隊(duì)列*TCOFLUSH清除輸出隊(duì)列*TCIOFLUSH清除輸入、輸出隊(duì)列舉例:tcflush(fd,TCIOFLUSH);另加的說(shuō)明:在打開(kāi)串口后,用戶其實(shí)已經(jīng)可以開(kāi)始從串口讀取數(shù)據(jù)了,但如果用戶沒(méi)有讀取,數(shù)據(jù)將被將保存在緩沖區(qū)里。如果用戶不想要開(kāi)始的一段數(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ù)打開(kāi)設(shè)備文件,函數(shù)返回一個(gè)文件描述符(filedescriptors,fd),通過(guò)文件描述符來(lái)訪問(wèn)文件。函數(shù)原型如下:intread(intfd,*buffer,length);參數(shù)說(shuō)明:(1).intfd:文件描述符(2).*buffer:數(shù)據(jù)緩沖區(qū)(3).length:要讀取的字節(jié)數(shù)函數(shù)返回值:讀操作成功讀取返回讀取的字節(jié)數(shù),失敗則返回-1。串口寫(xiě)操作write()(發(fā)送端)函數(shù)原型如下:write(intfd,*buffer,length);參數(shù)說(shuō)明:(1).fd:文件描述符(2).*buffer:存儲(chǔ)寫(xiě)入數(shù)據(jù)的數(shù)據(jù)緩沖區(qū)(3).length:寫(xiě)入緩沖去的數(shù)據(jù)字節(jié)數(shù)函數(shù)返回值:成

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論