《实验9指导书:串口通信实验.pdf》由会员分享,可在线阅读,更多相关《实验9指导书:串口通信实验.pdf(10页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、.-实验指导书:串口通信实验实验目的:实验目的:通过程序,理解并验证串口通信的编程方法和机制。本次实验分两个环节,第一环节为用程序发送字符串,用 linux 命令在另一窗口直接从串口读取;第二环节为用发送程序发送字符串,用接收程序在另一窗口读取串口并显示。要求必须完成第一环节,而第二环节为选作。本实验在虚拟机环境下完成,利用虚拟机创立两个虚拟串口,基于这两个虚拟串口完成串口通本实验在虚拟机环境下完成,利用虚拟机创立两个虚拟串口,基于这两个虚拟串口完成串口通信实验。信实验。实验容:实验容:本次实验需要在 linux 环境下,用 vi 工具输入对应的程序,并编译通过,运行后观察结果是否正确。一、设
2、置虚拟机串口1.1VMware 的串口:一个虚拟机最多可以添加四个虚拟串口,有如下3 个方法配置虚拟串口:(1)连接一个虚拟串口到宿主机的物理串口。(2)连接一个虚拟串口到宿主机上的一个文件。(3)在两个虚拟机之间建立一个直接的连接,或者将虚拟机的串口与宿主机的应用程序连接。1.2 为虚拟机添加串口首先要保证虚拟机下的 linux 处于关机关机power off)状态,(1)选择菜单中的虚拟机设置英文版为:VM-Settings,在硬件Hardware标签页中,如果.word.zl-.-已有串行端口serial port,那么选中该串口,并点选移除。(2)点击 Add 按钮,在 Add Har
3、dware Wizard 对话框中选择 Serial Port,点击 next,分两次添加两个串口,具体的选项如下列图:串口 2 的设置:.word.zl-.-注意两个串口都使用了命名管道方式,但一个是效劳器端,一个是客户端。(3)启动 linux 操作系统,测试两个串口是否设置成功在 linux 桌面空白处点击右键,翻开两个终端窗口。在其中一个窗口 称为窗口称为窗口 A A中,建立工作目录,并进入该目录。即,执行下述命令:1cd/home2mkdirsrc3cdsrc4cat/dev/ttyS1/注意是大写的 S在另一个窗口称为窗口称为窗口 B B执行下述命令:.word.zl-.-5cd/
4、home/src6echohello/dev/ttyS0/注意是大写的 S此时,应在窗口窗口 A A 中显示出“hello这个字符串,这说明窗口窗口 B B 通过串口/deb/ttyS0 发送的字符串,通过串口连接,在窗口窗口 A A 的串口/dev/ttyS1 上接收到了该字符串。在窗口窗口 A A 输入 Ctrl+c,可推出 cat 命令。环境设置完毕。可进入下面的代码编辑、编译、执行环节。二、仅创立串口发送程序,用在 linux 下用 cat 命令直接读取串口该环节为用 ttySend 程序发送字符串,用 linux 的 cat 命令在另一窗口直接从串口读取7vittySend.ctty
5、Send.c:/*File Name:send.c*Description:send data to serial_Port*Date:*/*头文件定义*/#include#include#include#include#include#include#include#include#define max_buffer_size100/*定义缓冲区最大宽度*/.word.zl-/创立 ttySend.c 文件,并输入下述代码.-/*/int fd;/*定义设备文件描述符*/int flag_close;int open_serial(int k)if(k=0)/*串口选择*/fd=open(/
6、dev/ttyS0,O_RDWR|O_NOCTTY);/*读写方式翻开串口*/perror(open/dev/ttyS0);elsefd=open(/dev/ttyS1,O_RDWR|O_NOCTTY);perror(open/dev/ttyS1);if(fd=-1)/*翻开失败*/return-1;elsereturn 0;/*/intmain(int argc,char*argv )char sbuf=Hello,this is a Serial_Port test!n;/*待发送的容,以n 为完毕标志*/int sfd,retv,i;struct termios option;int l
7、ength=sizeof(sbuf);/*发送缓冲区数据宽度*/*/open_serial(0);/*翻开串口 1*/*/printf(ready for sending data.n);/*准备开场发送数据*/tcgetattr(fd,&option);.word.zl-.-cfmakeraw(&option);/*/cfsetispeed(&option,B9600);/*波特率设置为 9600bps*/cfsetospeed(&option,B9600);/*/tcsetattr(fd,TCSANOW,&option);retv=write(fd,sbuf,length);/*接收数据*
8、/if(retv=-1)perror(write);printf(the number of char sent is%dn,retv);flag_close=close(fd);if(flag_close=-1)/*判断是否成功关闭文件*/printf(Close the Device failur!n);输入完毕后保存退出。执行命令:8gcc-ottySendttySend.c/编译,并指定生成文件为ttySend编译成功后,再 linux 桌面空白处点击右键,新建一个终端,执行下述命令:9cat/dev/ttyS1/注意,是大写的 S,用于接收发送端发送的字符串然后切换回刚刚的编译窗口,
9、执行下述命令:10./ttySend显示如下:/发送字符串.word.zl-.-此时,在接收的终端窗口,应显示如下:按 ctrl+C 可退出接收程序的等待循环三、ttySend 程序发送,ttyReceive 程序接收步骤一是用 ttySend 程序发送,用 cat 命令直接在另一个终端接收了串口的输出。本步骤在步骤一的根底上,用 ttySend 程序发送,用 ttyReceive 程序接收。在步骤一的接收窗口,按ctrl+C 退出 cat 接收命令,并执行下述命令:11 cd/home/src12 vittyReceive.cttyReceive.c/*Filename:receive.c*
10、Description:Receive data from Serial_Port*Date:*/*头文件定义*/#include#include#include#include#include#include#include#include.word.zl-/进入工作目录/创立 ttyReceive.c 文件,并输入下述代码.-#include math.h#define max_buffer_size100/*定义缓冲区最大宽度*/*/int fd,s;int open_serial(int k)if(k=0)/*串口选择*/fd=open(/dev/ttyS0,O_RDWR|O_NOCT
11、TY);/*读写方式翻开串口*/perror(open/dev/ttyS0);elsefd=open(/dev/ttyS1,O_RDWR|O_NOCTTY);perror(open/dev/ttyS1);if(fd=-1)/*翻开失败*/return-1;elsereturn 0;/*/int main()charhdmax_buffer_size,*rbuf;/*定义接收缓冲区*/int flag_close,retv,i,ncount=0;struct termios opt;int realdata=0;/*/open_serial(1);/*翻开串口 1*/*/tcgetattr(fd
12、,&opt);cfmakeraw(&opt);.word.zl-.-/*/cfsetispeed(&opt,B9600);/*波特率设置为 9600bps*/cfsetospeed(&opt,B9600);/*/tcsetattr(fd,TCSANOW,&opt);rbuf=hd;/*数据保存*/printf(ready for receiving data.n);retv=read(fd,rbuf,1);/*接收数据*/if(retv=-1)printf(read error:%dn,retv);perror(read);/*读状态标志判断*/*开场接收数据*/while(*rbuf!=n)
13、/*判断数据是否接收完毕*/ncount+=1;rbuf+;retv=read(fd,rbuf,1);if(retv=-1)printf(read error in whilen);perror(read);/*/printf(The data received is:n);/*输出接收到的数据*/for(i=0;incount;i+)printf(%c,hdi);printf(n);.word.zl-.-flag_close=close(fd);if(flag_close=-1)/*判断是否成功关闭文件*/printf(Close the Device failur!n);输入完毕后保存退出。执行命令:13 gcc-ottyReceivettyReceive.c/编译,指定输出为 ttyReceive14./ttyReceive/执行接收程序,等待发送窗口发送字符串在步骤一的 ttySend 窗口,执行下述命令:15./ttySend/编译,需指定 pthread 库在发送窗口显示如下:在接收窗口显示如下:本次实验完毕。.word.zl-
限制150内