网络与通信实验报告网络与通信实验报告题目:串口通行实验班级:0309103学号:030910338姓名:田静指导老师:付大丰日期:2012-10-21网络与通信实验报告一、实验要求把两台计算机的串口通过串口线连在一起,通过串口实现两台计算机通讯。可以利用高级语言、C语言编程实现,要求程序界面友好,有发送和接收功能,其接收和发送内容可在屏幕上显示。二、实验原理串口通讯把数据的字节分解成单个的二进制比特流依次传输,其结构简单,连接线少,应用非常广泛。实现串口通信的方法很多。如:利用标准通信函数实现串口通信、利用API实现串口通信和利用ActiveX控件实现。本文主要采用ActiveX控件MicrosoftCommunicationsControl(MSComm)编程,Windows平台先进的ActiveX技术使得对串口编程不再需要处理烦琐的细节。利用已有的AxtiveX控件,只需要编写少量的代码,就可以轻松高效地完成任务。以下对ActiveX控件属性进行简单介绍,在ClassWizard中为新创建的通信控件定义成员对象(CMSCommm_comm),通过该对象便可以对串口属性进行设置,MSComm控件共有27个属性,这里只介绍其中几个常用属性:CommPort:设置并回通讯端口号,缺省为COMl。Settings:以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。PortOpen:设置并返回通讯端口的状态,也可以打开和关闭端口。Input:从接收缓冲区返回和删除字符。Output:向发送缓冲区写一个字符串。InputLen:设置每次Input读入的字符个数,缺省值为0,表明读取接收缓冲区中的全部内容。InBufferCount:返回接收缓冲区中已接收到的字符数,将其置0可以清除接收缓冲区。InputMode:定义Input属性获取数据的方式(为0:文本方式;为1:二进制方式)。RThreshold和SThreshold:表示在OnComm事件发生之前,接收缓冲区或发送缓冲区中可以接收的字符数。三、实验步骤1、建立应用工程启动VC++6.0,创建一个基于对话框的MFC应用程序项目,选择Project菜单下AddtoProject子菜单中的ComponentsandControls选项,在弹出的对话框中双击RegisteredActiveXControls项,则所有注册过的ActiveX控件出现在列表框中。选择MicrosoftCommunicationsCon—trolversion6.0,单击insert按钮即可将通信控件插入该工程。添加该控件到对话框中,设置控件ID号为IDC_MSCOMM.2、添加界面控件将对话框中的按钮“取消”删除,将“确定”按钮改为“退出”。在对话框中添加适当的界面控件。本实验中需添加的标注用的静态控件、用于选择串口和设置波特率的组合框分别设置控件ID号为IDC_COMBO_SELECT和IDC_COMBO_BTLSET、添加控制开始发送/接收按钮控件并设置控件ID号为IDC_BUTTON_START,添加用于输入发送数据和输出接收数据的编辑框并设置控件ID号为IDC_EDIT_SEND网络与通信实验报告和IDC_EDIT_RECEVE,同时为其设置各种属性。添加完后如下图:3、映射控件通用消息(1)打开MFCClassWizard对话框,单击MemberValuable为相应控件添加变量。添加变量名和类型如下表:控件ID号变量名变量类似IDC_EDIT_RECEVECStringm_recevedataIDC_EDIT_SENDCStringm_sendIDC_COMBO_SELECTCComboBoxm_comselectIDC_COMBO_BTLSETCComboBoxm_btlsetIDC_MSCOMMCMSComm_comm如下图:网络与通信实验报告(2)单击MessageMaps,添加对话框初始化函数BOOLCCOMM_TDlg::OnInitDialog();编辑加入代码如下:BOOLCCOMM_TDlg::OnInitDialog(){//TODO:Addextrainitializationherem_comselect.AddString(COM1);//为组合框设置选项,即设定串口选项m_comselect.AddString(COM2);m_comselect.AddString(COM3);m_comselect.AddString(COM4);m_comselect.AddString(COM5);m_comselect.SetCurSel(0);//设置默认串口是COM1m_btlset.AddString(2400);//为组合框设置选项,即设定波特率选项m_btlset.AddString(4800);m_btlset.AddString(9600);m_btlset.AddString(19200);m_btlset.AddString(38400);m_btlset.SetCurSel(0);//设置默认波特率为2400returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}(3)为按钮IDC_BUTTON_START添加单击响应函数voidCCOMM_TDlg::OnButtonStart();函数代码如下:voidCCOMM_TDlg::OnButtonStart(){intn_com,n_set,i;CStringtemp;n_set=m_btlset.GetCurSel();//获取波特率选择索引号switch(n_set)//转换为对应的波特率{case0:i=19200;break;case1:i=2400;break;case2:i=38400;break;case3:i=4800;break;case4:i=9600;break;网络与通信实验报告}temp.Format(%d,n,8,1,i);//将设置参数转换为CString类型存入temp中m_comm.SetSettings(temp);//波特率设置m_comm.SetInputMode(1);//1:表示以二进制方式检取数据m_comm.SetRThreshold(1);m_comm.SetInBufferSize(1024);//设置输入缓冲区的大小m_comm.SetOutBufferSize(512);//设置输出缓冲区的大小//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件n_com=m_comselect.GetCurSel();m_comm.SetCommPort(n_com);//选择comif(!m_comm.GetPortOpen())m_comm.SetPortOpen(TRUE);//打开串口elseAfxMessageBox(不能打开该串口。);m_comm.SetInputLen(0);//设置当前接收区数据长度为0m_comm.GetInput();//先预读缓冲区以清除残留数据UpdateData(TRUE);//读取编辑框内容intCount=m_send.GetLength();//字符串长度charTxData[1000];intj;for(j=0;jCount;j++)TxData[j]=m_send.GetAt(j);//要发送的字符串送字符数组CByteArrayarray;array.RemoveAll();array.SetSize(Count);for(j=0;jCount;j++)array.SetAt(j,TxData[j]);//将字符数组型m_comm.SetOutput(COleVariant(array));//发送数据//TODO:Addyourcontrolnotificationhandlercodehere}(4)为IDC_MSCOMM添加消息映射函数voidCCOMM_TDlg::OnOnCommMscomm()以便当接收缓冲区有数据时做相应处理。添加代码如下:voidCCOMM_TDlg::OnOnCommMscomm(){VARIANTvariant_inp;COleSafeArraysafearray_inp;longlen,k;BYTErxdata[2048];//设置BYTE数组An8-bitintegerthatisnotsigned.CStringstrtemp;if(m_comm.GetCommEvent()==2)//事件值为2表示接收缓冲区内有字符{////////以下你可以根据自己的通信协议加入处理代码网络与通信实验报告variant_inp=m_comm.GetInput();//读缓冲区safearray_inp=variant_inp;//VARIANT型变量转换为ColeSafeArray型变量len=safearray_inp.GetOneDimSize();//得到有效数据长度for(k=0;klen;k++)safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组for(k=0;klen;k++)//将数组转换为Cstring型变量{BYTEbt=*(char*)(rxdata+k);//字符型strtemp.Format(%c,bt);//将字符送入临时变量strtemp存放m_recevedata+=strtemp;//加入接收编辑框对应字符串}}UpdateData(FALSE);//更新编辑框内容,显示接收到的数据//TODO:Addyourcontrolnotificationhandlercodehere}(5)编译、链接、运行会在相应工程目录下的debug目录下生成可执行的EXE文件。连接好串口线后运行该文件可进行串口通信。运行如下:四、通信测试A机运行如下:网络与通信实验报告B机运行如下:五、实验心得通过本次串口通信实验,让我对串口通信原理有了更近一步的理解。同时通过应用VC++6.0带的MFC进行串口通信API应用和用户界面制作,使我对VC++的使用更加熟练,同时也掌握了ActiveX控件的使用方法及原理。总之,在本次实验中我收获很多,不仅在通信方面的知识有所提升、VC++软件的使用更加熟练,而且也让我学会了一些调试的方法,通过编程实现如上功能的同时,也让我温习了以前所学的C以及C++语言的编程开发。同时通过本课程的学习,让我了解了数据通信基础知识;计算机网络体系结构与协议;OSI参考模型和TCP/IP参考模型;网络连接设备如中继器、集线器、网桥、路由器、交换机等的工作原理等等;广域网实用组网技术;以太网组建和组网技术;计算机局域网相关知识和对等网络的组建等等。总之,在本课程学习过程中我学到了很多我以前不知道的知识,我有所了解的计算机网络相关知识也得到了巩固。同时付老师在上课的时候也为我们介绍了一些使用的技术,使我们的操作能力也得到了提升。