-1-基于串口通信的高级语言控制程序的设计1引言1.1问题的提出在Windows环境下,串口是系统资源的一部分。应用程序要使用串口进行通信,必须在使用前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。在Windows的系统函数中,均包含了支持通信中断的功能。对串口通信而言,Windows为相应的串口设备开放了用户定义的输出缓冲区和输入缓冲区,应用程序只能对输入/输出缓冲区进行操作,数据进出歘口的操作均由系统后台完成。以接收受为例,系统每接收到的字符送入输入缓冲区,此时应用程序就可以通过访问输入缓冲区得到接收到的字符信息。Windows为用户提供了两种方式实现串口通信:使用串口通信控件使用Windows的API应用程序接口使用串口通信控件进行串口程序开发极为方便,如果不需要对串口进行高级控制一般多选择使用MSComm控件进行开发。针对串口通信,微软公司专门提供了MSComm控件,使用该控件进行串口通信设计是十分方便的,程序员不必花时间去了解较为复杂的API函数。通过简单修改控件的属性和使用控件提供的方法,就可以实现对串口的配置、完成串口接收和发送数据。MicronsoftCommunicationsControl(MSComm)是Micronsoft公司提供的简化Windows下串口通信编程的ActiveX控件,它为应用程序提供了通过串口收发数据的简便方法。在串口编程中,使用MSComm控件非常方便,仅需通过简单修改控件属性和使用控件提供的方法,就可以实现对串口的配置,完成串口接收和发送数据等任务。在mfc中进行串口通讯最简单的方法莫过于在对话框中使用MSCOMM控件了,MSComm通信控件提供了一系列标准通信命令的接口,它允许建立串口连接,可以连接到其他通信设备(如Modem).还可以发送命令、进行数据交换以及监视和响应在通信过程中可能发生的各种错误和事件,从而可以用它创建全双工、事件驱动的、高效实用的通信程序。-2-基于串口通信的高级语言控制程序的设计1.2国内外研究的现状串行通信在通讯领域被广泛应用,标准的RS232接口已成为计算机、外设、交换机和许多通讯设备的标准接口.虽然近年来随着USB口的日趋流行,RS232接口串口1.3任务与分析任务:设计一个串口通讯程序,实现对数据的发送和接受。要求:(1)、有良好的用户界面(2)、串口可选,其他设置默认值不变(3)、在同一计算机上进行调试(4)、可进行单个数据或成批数据传输个单选框对应六个串口。2程序的主要功能2.1串口选择、打开、关闭功能通过单选框实现选择通信串口(COM1/COM2/COM3……),其他串口设置默认设置为:波特2.2发送数据功能通过【发送】按钮对应函数OnButtonManualsend()来实现。发送数据时,程序仅需要读出发送编辑框的内容,将其转化为发送程序需要的数据格式后,再使用C语言中的强制类型转换功能,将其转换为ColeVariant数据类型,由MSComm类的SetOutput()函数送入发送缓冲区即可。2.3接收功能当MSComm的接收缓冲区有字符时,程序会发送事件消息,OnOnCommMscomm1()函数响应该消息并进行处理,由于MSComm类GetInput()函数返回的数据变量类型为Variant型,而编辑框对应的显示字符串是Cstring型,因此接收数据时,需要先进行类型转换。在VC中,转换过程如下:-3-基于串口通信的高级语言控制程序的设计将Variant类型转换为ColeSafeArray类型;将ColeSafeArray类型转换为BYTE类型数组;将BYTE类型数组转换为Cstring变量。2.4发送、接收计数并显示功能通过【发送:】【接收:】按钮(属性中样式选为:浮动)实现显示发送接收计数显示。2.5清除显示功能分别通过【清空显示】【清空显示】【清空计数】按钮将发送区、接收区、计数显示清空。2.6退出程序功能通过【退出】按钮实现退出程序的功能。3程序运行平台VC++6.0、串口调试助手V2.1、VSPM虚拟串口具体操作如下:3.1创建基于对话框的MFC应用程序打开vc++6.0文件---新建---工程(选择MFCAppWizard[exe])工程名:tudanmscomm;选择文件保存位置---确定----选基本对话框---下一步---下一步(默认设置)-----下一步(默认设置)---选择CmyDlg---完成---确定。3.2在当前的Workspace中插入MSComm控件在设置项目选项时必须选上ActiveXControls,其他的按照缺省设置。然后进行3.3其他控件添加根据自己的设计,将相应的控件添加到对话框中,并修改属性以及相应的添加变量。设计好的对话框如下图所示:-4-基于串口通信的高级语言控制程序的设计3.4程序编辑根据设计要求内容编辑程序,并通过反复的调试、编译、连接、执行,完成设计要求,并运行成功,能够实现各个功能要求。4总体设计图4.1系统总体框架图选择串口打开串口删除信息关闭串口清空信息发送数据修改信息主函数接收数据显示信息清除发送去显示查找信息清除接收查找信息清除计数查找信息退出程序查找信息-5-基于串口通信的高级语言控制程序的设计5程序类的说明CMSCommDlg类的声明voclassCMSommDlg:publicCDialog{//Constructionpublic:CMSCommDlg(CWnd*pParent=NULL);//standardconstructor//DialogData//{{AFX_DATA(CMSCommDlg)enum{IDD=IDD_MSCOMM_DIALOG};//各个控件对应控件ID的变量类型以及对应的变量名CButtonm_recvcount;CButtonm_sendcount;CButtonm_comclose;CButtonm_comopen;CMSCommm_mscomm;CStringm_str_send;CStringm_str_recv;//}}AFX_DATA//ClassWizardgeneratedvirtualfunctionoverrides//{{AFX_VIRTUAL(CMSCommDlg)protected:virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport//}}AFX_VIRTUAL//Implementationprotected:HICONm_hIcon;//Generatedmessagemapfunctions-6-基于串口通信的高级语言控制程序的设计//{{AFX_MSG(CTudanmscommDlg)virtualBOOLOnInitDialog();afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam);afx_msgvoidOnPaint();afx_msgHCURSOROnQueryDragIcon();afx_msgvoidOnCleandata1();//清除接收区显示afx_msgvoidOnCleancounter();//清除发送、接收计数afx_msgvoidOnQuit();//退出程序afx_msgvoidOnClosecom();//关闭串口afx_msgvoidOnOnCommMscomm1();//接收缓冲区响应函数afx_msgvoidOnSenddata();//数据发送afx_msgvoidOnCleandata2();//清除发送区显示afx_msgvoidOnOpencom();//打开串口afx_msgvoidOnRadio1();//串口选择COM1afx_msgvoidOnRadio2();//串口选择COM2afx_msgvoidOnRadio3();//串口选择COM3afx_msgvoidOnRadio4();//串口选择COM4DECLARE_EVENTSINK_MAP()//}}AFX_MSGDECLARE_MESSAGE_MAP()};6模块分析6.1初始化模块m_mscomm.SetCommPort(1);//选择COM1//波特率9600,无校验,8个数据位,1个停止位m_mscomm.SetInputMode(1);//输入方式为二进制方式m_mscomm.SetInBufferSize(1024);//设置输入缓冲区大小m_mscomm.SetOutBufferSize(512);//设置输chu缓冲区大小//设置波特率9600,无校验,8个数据位,1个停止位m_mscomm.SetSettings(9600,N,8,1);-7-基于串口通信的高级语言控制程序的设计if(!m_mscomm.GetPortOpen())m_mscomm.SetRThreshold(1);//参数1表示每当串口接收缓冲区中有多于或等于一个字符时将引发一个接收数据oncomm事件m_mscomm.SetInputLen(0);//设置当前接受区数据长度为0m_mscomm.GetInput();//先预读缓冲区以清除残余数据m_comopen.EnableWindow(false);//打开串口按钮无效m_comclose.EnableWindow(true);//关闭串口按钮有效6.2串口选择模块单选按钮实现串口选择:voidCMSCommDlg::OnRadio1(){radionumber=1;if(m_mscomm.GetPortOpen()){m_mscomm.SetPortOpen(false);//关闭串口m_comopen.EnableWindow(true);//打开串口按钮有效m_comclose.EnableWindow(false);//关闭串口按钮失效}m_mscomm.SetCommPort(radionumber);//选择相应的COM1m_mscomm.SetPortOpen(true);//关闭串口m_comopen.EnableWindow(false);//打开串口按钮有效m_comclose.EnableWindow(true);//关闭串口按钮失效}voidCMSCommDlg::OnRadio2()-8-基于串口通信的高级语言控制程序的设计{//TODO:Addyourcontrolnotificationhandlercodehereradionumber=2;if(m_mscomm.GetPortOpen()){m_mscomm.SetPortOpen(false);//关闭串口m_comopen.EnableWindow(true);//打开串口按钮有效m_comclose.EnableWindow(false);//关闭串口按钮失效}m_mscomm.SetCommPort(radionumber);//选择相应的COM2m_mscomm.SetPortOpen(true);//关闭串口m_comopen.EnableWindow(false);//打开串口按钮有效m_comclose.EnableWindow(true);//关闭串口按钮失效}voidCMSCommDlg::OnRadio3(){//TODO:Addyourcontrolnotificationhandlercodehereradionumber=3;if(m_mscomm.GetPortOpen()){m_mscomm.SetPortOpen(false);//关闭串口-9-基于串口通信的高级语言控制程序的设计m_comopen.EnableWindow(true);//打开串口按钮有效m_comclose.EnableWindow(false);//关闭串口按钮失效}m_mscomm.SetCommPort(radionumber);//选择相应的COM3m_mscomm.SetPortOpen(