




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
實(shí)驗(yàn)2:串行端口程序設(shè)計(jì)一、實(shí)驗(yàn)?zāi)康牧私庠趌inux環(huán)境下串行程序設(shè)計(jì)的基本方法。掌握終端的主要屬性及設(shè)置方法,熟悉終端I/O函數(shù)的使用。學(xué)習(xí)使用多線程來(lái)完成串口的收發(fā)處理。二、實(shí)驗(yàn)內(nèi)容讀懂程序源代碼,學(xué)習(xí)終端I/O函數(shù)的使用方法,學(xué)習(xí)將多線程編程應(yīng)用到串口的接收和發(fā)送程序設(shè)計(jì)中。三、預(yù)備知識(shí)有C語(yǔ)言基礎(chǔ)。掌握在Linux下常用編輯器的使用。掌握Makefile的編寫(xiě)和使用。掌握Linux下的程序編譯與交叉編譯過(guò)程四、 實(shí)驗(yàn)設(shè)備及工具硬件:UP-NETARM2410-S嵌入式實(shí)驗(yàn)平臺(tái)、PC機(jī)Pentium500以上,硬盤(pán)10G以上。軟件:PC機(jī)操作系統(tǒng)REDHATLINUX9.0+MINICOM+ARM-LINUX開(kāi)發(fā)環(huán)境五、 實(shí)驗(yàn)原理異步串行I/O方式是將傳輸數(shù)據(jù)的每個(gè)字符一位接一位(例如先低位、后高位)地傳送。數(shù)據(jù)的各不同位可以分時(shí)使用同一傳輸通道,因此串行I/O可以減少信號(hào)連線,最少用一對(duì)線即可進(jìn)行。接收方對(duì)于同一根線上一連串的數(shù)字信號(hào),首先要分割成位,再按位組成字符。為了恢復(fù)發(fā)送的信息,雙方必須協(xié)調(diào)工作。在微型計(jì)算機(jī)中大量使用異步串行I/O方式,雙方使用各自的時(shí)鐘信號(hào),而且允許時(shí)鐘頻率有一定誤差,因此實(shí)現(xiàn)較容易。但是由于每個(gè)字符都要獨(dú)立確定起始和結(jié)束(即每個(gè)字符都要重新同步),字符和字符間還可能有長(zhǎng)度不定的空閑時(shí)間,因此效率較低。MlL/O1/(1I/OI.UI/O1川MlL/O1/(1I/OI.UI/O1川L/U? 第■『書(shū) ?b. I), b? I);b, I》、 bu j £ -i ? n-r^住閑I'/吃閑I'/停
||;圖2.3.1串行通信字符格式圖2.3.1給出異步串行通信中一個(gè)字符的傳送格式。開(kāi)始前,線路處于空閑狀態(tài),送出連續(xù)“1”。傳送開(kāi)始時(shí)首先發(fā)一個(gè)“0”作為起始位,然后出現(xiàn)在通信線上的是字符的二進(jìn)制編碼數(shù)據(jù)。每個(gè)字符的數(shù)據(jù)位長(zhǎng)可以約定為5位、6位、7位或8位,一般采用ASCII編碼。后面是奇偶校驗(yàn)位,根據(jù)約定,用奇偶校驗(yàn)位將所傳字符中為“1”的位數(shù)湊成奇數(shù)個(gè)或偶數(shù)個(gè)。也可以約定不要奇偶校驗(yàn),這樣就取消奇偶校驗(yàn)位。最后是表示停止位的“1”信號(hào),這個(gè)停止位可以約定持續(xù)1位、1.5位或2位的時(shí)間寬度。至此一個(gè)字符傳送完畢,線路又進(jìn)入空閑,持續(xù)為“1”。經(jīng)過(guò)一段隨機(jī)的時(shí)間后,下一個(gè)字符開(kāi)始傳送才又發(fā)出起始位。每一個(gè)數(shù)據(jù)位的寬度等于傳送波特率的倒數(shù)。微機(jī)異步串行通信中,常用的波特率為50,95,110,150,300,600,1200,2400,4800,9600等。接收方按約定的格式接收數(shù)據(jù),并進(jìn)行檢查,可以查出以下三種錯(cuò)誤:奇偶錯(cuò):在約定奇偶檢查的情況下,接收到的字符奇偶狀態(tài)和約定不符。幀格式錯(cuò):一個(gè)字符從起始位到停止位的總位數(shù)不對(duì)。溢出錯(cuò):若先接收的字符尚未被微機(jī)讀取,后面的字符又傳送過(guò)來(lái),則產(chǎn)生溢出錯(cuò)。每一種錯(cuò)誤都會(huì)給出相應(yīng)的出錯(cuò)信息,提示用戶處理。一般串口調(diào)試都使用空的MODEM連接電纜,其連接方式如下:埶fil些鋤t弄好埶fil些鋤t弄好MW拠—I 甜抿樣捲樂(lè)RI 22 1 L—223三建武股送數(shù)據(jù)Tx訂擅收敦曙RxD;2ZX3 _" 、_ 20戟放轍謂DCU圖2.3.2實(shí)用RS-232C通訊連線六、程序分析Linux操作系統(tǒng)從一開(kāi)始就對(duì)串行口提供了很好的支持,為進(jìn)行串行通訊提供了大量的函數(shù),我們的實(shí)驗(yàn)主要是為掌握在Linux中進(jìn)行串行通訊編程的基本方法。本實(shí)驗(yàn)的程序流程圖如下:
接收線程發(fā)送線程否星是主程序定殳接收變量定義發(fā)送變量讀取串口1字節(jié)數(shù)據(jù)建立鍵盤(pán)、發(fā)送、接收線程向標(biāo)準(zhǔn)輸出打印讀取字符退出退出向串口輸出字符變量休眠1QQ毫秒關(guān)閉com恢復(fù)終端屬性等待線程結(jié)束接收線程發(fā)送線程否星是主程序定殳接收變量定義發(fā)送變量讀取串口1字節(jié)數(shù)據(jù)建立鍵盤(pán)、發(fā)送、接收線程向標(biāo)準(zhǔn)輸出打印讀取字符退出退出向串口輸出字符變量休眠1QQ毫秒關(guān)閉com恢復(fù)終端屬性等待線程結(jié)束設(shè)置coin終端屬性打開(kāi)串口1設(shè)備〔變量+1)%255保存終端屬性圖2.3.3串口通訊實(shí)驗(yàn)流程圖本實(shí)驗(yàn)的代碼如下:#includevtermios.h>#includevstdio.h>#include<unistd.h>#includevfcntl.h>#includevsys/signal.h>#includevpthread.h>#defineBAUDRATEB115200#defineCOM1"/dev/ttySO"#defineCOM2"/dev/ttyS1"#defineENDMINITERM27 /*ESCtoquitminiterm*/#defineFALSE0#defineTRUE1volatileintSTOP=FALSE;volatileintfd;voidchild_handler(ints){
printf("stop!!!\n");STOP=TRUE;}/* */void*keyboard(void*data){intc;for(;;){c=getchar();if(c==ENDMINITERM){STOP=TRUE;break;}}returnNULL;}/* *//*modeminputhandler*/void*receive(void*data){intc;printf("readmodem\n");while(STOP==FALSE){read(fd,&c,l);/*comport*/write(1,&c,1);/*stdout*/}printf("exitfromreadingmodem\n");returnNULL;}/* */void*send(void*data){intc='0';printf("senddata\n");while(STOP==FALSE)/*modeminputhandler*/{c++;c%=255;write(fd,&c,1);/*stdout*/usleep(lOOOOO);}returnNULL;}*/}returnNULL;}*/intmain(intargc,char**argv){structtermiosoldtio,newtio,oldstdtio,newstdtio;structsigactionsa;intok;pthread_tth_a,th_b,th_c;void*retval;if(argc>1)fd=open(C0M2,O_RDWR);elsefd=open(COM1,O_RDWR);〃lO_NOCTTYIO_NONBLOCK);訐(fd<0){error(COMl);exit(-l);}tcgetattr(0,&oldstdtio);tcgetattr(fd,&oldtio); /*savecurrentmodemsettings*/tcgetattr(fd,&newstdtio); /*getworkingstdtio*/newtio.c_cflag=BAUDRATEICRTSCTSICS8ICLOCALICREAD;/*ctrolflag*/newtio.c_iflag=IGNPAR; /*inputflag*/newtio.c_oflag=0; /*outputflag*/newtio.c_lflag=0;newtio.c_cc[VMIN]=1;newtio.c_cc[VTIME]=O;/*nowcleanthemodemlineandactivatethesettingsformodem*/tcflush(fd,TCIFLUSH);tcsetattr(fd,TCSANOW,&newtio); /*setattrib*/sa.sa_handler=child_handler;sa.sa_flags=0;sigaction(SIGCHLD,&sa,NULL); /*handledyingchild*/pthread_create(&th_a,NULL,keyboard,0);pthread_create(&th_b,NULL,receive,0);pthread_create(&th_c,NULL,send,0);pthread_join(th_a,&retval);pthread_join(th_b,&retval);pthread_join(th_c,&retval);tcsetattr(fd,TCSANOW,&oldtio); /*restoreoldmodemsetings*/tcsetattr(0,TCSANOW,&oldstdtio); /*restoreoldttysetings*/close(fd);exit(0);}
面我們對(duì)這個(gè)程序的主要部分做一下簡(jiǎn)單的分析>頭文件#includevstdio.h>/*標(biāo)準(zhǔn)輸入輸出定義*/#includevstdlib.h>/*標(biāo)準(zhǔn)函數(shù)庫(kù)定義*/#include<unistd.h>/*linux標(biāo)準(zhǔn)函數(shù)定義*/#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>/*文件控制定義*/#include<termios.h>/*PPSIX終端控制定義*/#include<errno.h>/*錯(cuò)誤號(hào)定義*/#include<pthread.h>/*線程庫(kù)定義*/>打開(kāi)串口在Linux下串口文件位于/dev下,一般在老版本的內(nèi)核中串口一為/dev/ttySO,串口二為/dev/ttyS1,在我們的開(kāi)發(fā)板中串口設(shè)備位于/dev/tts/下,因?yàn)殚_(kāi)發(fā)板中沒(méi)有ttySO這個(gè)設(shè)備,所以我們要建立一個(gè)連接,方法如下:[/mnt/yaffs]cd/dev[/dev]In-f/dev/tts/0ttySO打開(kāi)串口是通過(guò)標(biāo)準(zhǔn)的文件打開(kāi)函數(shù)來(lái)實(shí)現(xiàn)的intfd;fd=open("/dev/ttySO",O_RDWR);/*以讀寫(xiě)方式打開(kāi)串口*/訐(-1==fd){ /*不能打開(kāi)串口一*/perror(“提示錯(cuò)誤!");}—A串口設(shè)置最基本的設(shè)置串口包括波特率設(shè)置,效驗(yàn)位和停止位設(shè)置。串口的設(shè)置主要是設(shè)置structtermios結(jié)構(gòu)體的各成員值,關(guān)于該結(jié)構(gòu)體的定義可以查看/arm2410s/kernel—2410s/include/asm/termios.h文件。structtermio{unsignedshortc_iflag;unsignedshortc_oflag;unsignedshortc_cflag;unsignedshortc_lflag;unsignedchar c_line;{unsignedshortc_iflag;unsignedshortc_oflag;unsignedshortc_cflag;unsignedshortc_lflag;unsignedchar c_line;unsignedchar c_cc[NCC];/*輸入模式標(biāo)志*//*輸出模式標(biāo)志*//*控制模式標(biāo)志*//*localmodeflags*//*linediscipline*//*controlcharacters*/};設(shè)置這個(gè)結(jié)構(gòu)體很復(fù)雜,可以參考man手冊(cè)或者由趙克佳、沈志宇編寫(xiě)的《UNIX程序編寫(xiě)教程》,我這里就只考慮常見(jiàn)的一些設(shè)置:?波特率設(shè)置:面是修改波特率的代碼:structtermiosOpt;tcgetattr(fd,&Opt);cfsetispeed(&Opt,B19200);cfsetospeed(&Opt,B19200);tcsetattr(fd,TCANOW,&Opt);/*設(shè)置為19200Bps*/?校驗(yàn)位和停止位的設(shè)置:無(wú)效驗(yàn)8位Option.c_cflag&=?PARENB;Option.c_cflag&=?CSTOPB;Option.c_cflag&=?CSIZE;Option.ccflag1=?CS8;奇效驗(yàn)(Odd)7位Option.c_cflag1=?PARENB;Option.c_cflag&=?PARODD;Option.c_cflag&=?CSTOPB;Option.c_cflag&=?CSIZE;Option.ccflag1=~CS7;偶效驗(yàn)(Even)7位Option.c_cflag&=?PARENB;Option.c_cflag1=~PARODD;Option.c_cflag&=?CSTOPB;Option.c_cflag&=?CSIZE;Option.ccflag1=~CS7;Space效驗(yàn)7位Option.c_cflag&=?PARENB;Option.c_cflag&=?CSTOPB;Option.c_cflag&=&~CSIZE;Option.ccflag1=CS8;?設(shè)置停止位:1位:options.ccflag&=?CSTOPB;2位:options.ccflag1=CSTOPB;注意:如果不是開(kāi)發(fā)終端之類的,只是串口傳輸數(shù)據(jù),而不需要串口來(lái)處理,那么使用原始模式(RawMode)方式來(lái)通訊,設(shè)置方式如下:options.c_lflag&=?(ICANONIECHOIECHOEIISIG);/*Input*/options.c_oflag&=?OPOST; /*Output*/~~A讀寫(xiě)串口設(shè)置好串口之后,讀寫(xiě)串口就很容易了,把串口當(dāng)作文件讀寫(xiě)就可以了。?發(fā)送數(shù)據(jù):charbuffer[1024];int Length=1024;int nByte;nByte=write(fd,buffer,Length)?讀取串口數(shù)據(jù):使用文件操作read函數(shù)讀取,如果設(shè)置為原始模式(RawMode)傳輸數(shù)據(jù),那么read函數(shù)返回的字符數(shù)是實(shí)際串口收到的字符數(shù)??梢允褂貌僮魑募暮瘮?shù)來(lái)實(shí)現(xiàn)異步讀取,如fentl.或者select等來(lái)操作。charbuff[1024];int Len=1024;intreadByte=read(fd,buff,Len);~~A關(guān)閉串口關(guān)閉串口就是關(guān)閉文件。close(fd);七、實(shí)驗(yàn)步驟1、閱讀理解源碼進(jìn)入exp\basic\03_tty目錄,使用vi編輯器或其他編輯器閱讀理解源代碼。2、編譯應(yīng)用程序運(yùn)行make產(chǎn)生term可執(zhí)行文件[root@zxtroot]#cd/arm2410s/exp/basic/03_tty/[root@zxtO3_tty]#makearmv41-unknown-linux-gccarmv41-unknown-linux-gccarmv41-unknown-linux-gcc[root@zxt03_tty]#ls-c-oterm.oterm.c-o../bi
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 富氧燃燒施工方案
- 室內(nèi)藝術(shù)漆施工方案
- 2025年地理試題及答案
- 6年級(jí)下冊(cè)語(yǔ)文園地5日積月累朗讀
- 5年級(jí)下冊(cè)書(shū)人教版英語(yǔ)書(shū)
- centos中多線程壓縮命令
- 的田字格書(shū)寫(xiě)格式
- arcgis開(kāi)始編輯的代碼
- 廣東減震支架施工方案
- 登山臺(tái)階開(kāi)挖施工方案
- 《認(rèn)知理論》課件
- 2024年度寧夏回族自治區(qū)國(guó)家電網(wǎng)招聘之環(huán)化材料類題庫(kù)檢測(cè)試卷B卷附答案
- 2024年云南省中考物理真題含解析
- 《冠心病護(hù)理》課件
- 江蘇省蘇州市2023-2024學(xué)年八年級(jí)上學(xué)期期末語(yǔ)文試題及答案
- ECharts數(shù)據(jù)可視化課件 第3章 柱狀圖和散點(diǎn)圖
- 老年人護(hù)理安全風(fēng)險(xiǎn)管理
- 建筑施工企業(yè)成本控制管理制度
- 音樂(lè)課《詠鵝》教案7篇
- 中學(xué)校園廣播聽(tīng)力系統(tǒng)管理制度
- 《馬說(shuō)》說(shuō)課課件-2023-2024學(xué)年統(tǒng)編版語(yǔ)文八年級(jí)下冊(cè)
評(píng)論
0/150
提交評(píng)論