實(shí)驗(yàn)9指導(dǎo)書:串口通信實(shí)驗(yàn)_第1頁
實(shí)驗(yàn)9指導(dǎo)書:串口通信實(shí)驗(yàn)_第2頁
實(shí)驗(yàn)9指導(dǎo)書:串口通信實(shí)驗(yàn)_第3頁
實(shí)驗(yàn)9指導(dǎo)書:串口通信實(shí)驗(yàn)_第4頁
實(shí)驗(yàn)9指導(dǎo)書:串口通信實(shí)驗(yàn)_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、實(shí)驗(yàn)指導(dǎo)書:串口通信實(shí)驗(yàn)實(shí)驗(yàn)?zāi)康模和ㄟ^程序,理解并驗(yàn)證串口通信的編程方法和機(jī)制。本次實(shí)驗(yàn)分兩個環(huán)節(jié),第一環(huán)節(jié)為用程序發(fā)送字符串,用linux命令在另一窗口直接從串口讀取;第二環(huán)節(jié)為用發(fā)送程序發(fā)送字符串,用接收程序在另一窗口讀取串口并顯示。要求必須完成第一環(huán)節(jié),而第二環(huán)節(jié)為選作。本實(shí)驗(yàn)在虛擬機(jī)環(huán)境下完成,利用虛擬機(jī)創(chuàng)建兩個虛擬串口,基于這兩個虛擬串口完成串口通信實(shí)驗(yàn)。實(shí)驗(yàn)內(nèi)容:本次實(shí)驗(yàn)需要在linux環(huán)境下,用vi工具輸入對應(yīng)的程序,并編譯通過,運(yùn)行后觀察結(jié)果是否正確。一、設(shè)置虛擬機(jī)串口1.1 VMware的串口:一個虛擬機(jī)最多可以添加四個虛擬串口,有如下3個方法配置虛擬串口:(1) 連接一個虛

2、擬串口到宿主機(jī)的物理串口。(2) 連接一個虛擬串口到宿主機(jī)上的一個文件。(3) 在兩個虛擬機(jī)之間建立一個直接的連接,或者將虛擬機(jī)的串口與宿主機(jī)的應(yīng)用程序連接。1.2 為虛擬機(jī)添加串口首先要保證虛擬機(jī)下的linux處于關(guān)機(jī)(power off)狀態(tài),(1) 選擇菜單中的虛擬機(jī)à設(shè)置(英文版為:VM -> Settings),在硬件(Hardware)標(biāo)簽頁中,如果已有串行端口(serial port),則選中該串口,并點(diǎn)選移除。(2) 點(diǎn)擊Add按鈕,在Add Hardware Wizard對話框中選擇Serial Port,點(diǎn)擊next,分兩次添加兩個串口,具體的選項(xiàng)如下圖:串

3、口2的設(shè)置:注意兩個串口都使用了命名管道方式,但一個是服務(wù)器端,一個是客戶端。(3) 啟動linux操作系統(tǒng),測試兩個串口是否設(shè)置成功在linux桌面空白處點(diǎn)擊右鍵,打開兩個終端窗口。在其中一個窗口(稱為窗口A)中,建立工作目錄,并進(jìn)入該目錄。即,執(zhí)行下述命令:1 cd /home2 mkdir src3 cd src4 cat /dev/ttyS1/注意是大寫的S在另一個窗口(稱為窗口B)執(zhí)行下述命令:5 cd /home/src6 echo hello >/dev/ttyS0/注意是大寫的S此時,應(yīng)在窗口A中顯示出“hello”這個字符串,這表明窗口B通過串口/deb/ttyS0發(fā)送

4、的字符串,通過串口連接,在窗口A的串口/dev/ttyS1上接收到了該字符串。在窗口A輸入Ctrl+c,可推出cat命令。環(huán)境設(shè)置完畢。可進(jìn)入下面的代碼編輯、編譯、執(zhí)行環(huán)節(jié)。二、僅創(chuàng)建串口發(fā)送程序,用在linux下用cat命令直接讀取串口該環(huán)節(jié)為用ttySend程序發(fā)送字符串,用linux的cat命令在另一窗口直接從串口讀取7 vi ttySend.c/創(chuàng)建ttySend.c文件,并輸入下述代碼ttySend.c:/* File Name: send.c* Description: send data to serial_Port* Date: */*頭文件定義*/#include <s

5、tdio.h>#include <string.h>#include <malloc.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <termios.h>#define max_buffer_size 100 /*定義緩沖區(qū)最大寬度*/*/int fd; /*定義設(shè)備文件描述符*/int flag_close;int open_serial(int k) if(k=0)

6、/*串口選擇*/ fd = open("/dev/ttyS0",O_RDWR|O_NOCTTY); /*讀寫方式打開串口*/ perror("open /dev/ttyS0"); else fd = open("/dev/ttyS1",O_RDWR|O_NOCTTY); perror("open /dev/ttyS1"); if(fd = -1) /*打開失敗*/ return -1; else return 0;/*/int main(int argc, char *argv ) char sbuf="

7、Hello,this is a Serial_Port test!n"/*待發(fā)送的內(nèi)容,以n為結(jié)束標(biāo)志*/ int sfd,retv,i; struct termios option; int length=sizeof(sbuf);/*發(fā)送緩沖區(qū)數(shù)據(jù)寬度*/*/ open_serial(0); /*打開串口1*/*/ printf("ready for sending data.n"); /*準(zhǔn)備開始發(fā)送數(shù)據(jù)*/ tcgetattr(fd,&option); cfmakeraw(&option);/*/ cfsetispeed(&opti

8、on,B9600); /*波特率設(shè)置為9600bps*/ cfsetospeed(&option,B9600);/*/ tcsetattr(fd,TCSANOW,&option); retv=write(fd,sbuf,length); /*接收數(shù)據(jù)*/ if(retv=-1) perror("write"); printf("the number of char sent is %dn",retv); flag_close = close(fd); if(flag_close = -1) /*判斷是否成功關(guān)閉文件*/ printf(&q

9、uot;Close the Device failur!n");輸入完畢后保存退出。執(zhí)行命令:8 gcc -o ttySend ttySend.c /編譯,并指定生成文件為ttySend編譯成功后,再linux桌面空白處點(diǎn)擊右鍵,新建一個終端,執(zhí)行下述命令:9 cat /dev/ttyS1/注意,是大寫的S,用于接收發(fā)送端發(fā)送的字符串然后切換回剛才的編譯窗口,執(zhí)行下述命令:10 ./ttySend/發(fā)送字符串顯示如下:此時,在接收的終端窗口,應(yīng)顯示如下:按ctrl+C可退出接收程序的等待循環(huán)三、ttySend程序發(fā)送,ttyReceive程序接收步驟一是用ttySend程序發(fā)送,用c

10、at命令直接在另一個終端接收了串口的輸出。本步驟在步驟一的基礎(chǔ)上,用ttySend程序發(fā)送,用ttyReceive程序接收。在步驟一的接收窗口,按ctrl+C退出cat接收命令,并執(zhí)行下述命令:11 cd /home/src/進(jìn)入工作目錄12 vi ttyReceive.c/創(chuàng)建ttyReceive.c文件,并輸入下述代碼ttyReceive.c/* Filename:receive.c* Description:Receive data from Serial_Port* Date:*/*頭文件定義*/#include <stdio.h>#include <string.h

11、>#include <malloc.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <termios.h>#include "math.h"#define max_buffer_size 100 /*定義緩沖區(qū)最大寬度*/*/int fd,s;int open_serial(int k) if(k=0) /*串口選擇*/ fd = open("/dev/t

12、tyS0",O_RDWR|O_NOCTTY); /*讀寫方式打開串口*/ perror("open /dev/ttyS0"); else fd = open("/dev/ttyS1",O_RDWR|O_NOCTTY); perror("open /dev/ttyS1"); if(fd = -1) /*打開失敗*/ return -1; else return 0;/*/int main() char hdmax_buffer_size,*rbuf; /*定義接收緩沖區(qū)*/ int flag_close, retv,i,nco

13、unt=0; struct termios opt; int realdata=0;/*/ open_serial(1); /*打開串口1*/*/ tcgetattr(fd,&opt); cfmakeraw(&opt);/*/ cfsetispeed(&opt,B9600); /*波特率設(shè)置為9600bps*/ cfsetospeed(&opt,B9600);/*/ tcsetattr(fd,TCSANOW,&opt); rbuf=hd; /*數(shù)據(jù)保存*/ printf("ready for receiving data.n"); r

14、etv=read(fd,rbuf,1); /*接收數(shù)據(jù)*/ if(retv=-1) printf("read error:%dn",retv); perror("read"); /*讀狀態(tài)標(biāo)志判斷*/ /*開始接收數(shù)據(jù)*/ while(*rbuf!='n') /*判斷數(shù)據(jù)是否接收完畢*/ ncount+=1; rbuf+; retv=read(fd,rbuf,1); if(retv=-1) printf("read error in whilen");perror("read"); /*/ printf("The data received is:n"); /*輸出接收到的數(shù)據(jù)*/ for(i=0;i<ncount;i+) printf("%c",hdi); printf("n"); flag_close =close(fd); if(flag_close = -1) /*判斷是否成功關(guān)閉文件*

溫馨提示

  • 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

提交評論