基于MSComm控件串行异步通信程序设计 - 副本_第1页
基于MSComm控件串行异步通信程序设计 - 副本_第2页
基于MSComm控件串行异步通信程序设计 - 副本_第3页
基于MSComm控件串行异步通信程序设计 - 副本_第4页
基于MSComm控件串行异步通信程序设计 - 副本_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

+*******************实践教学*******************兰州理工大学计算机与通信学院2015年秋季学期计算机通信课程设计题目:基于MSComm控件的串行异步通信程序设计_专业班级: _姓名:_______学号:__________指导教师:王惠琴_________成绩:________________摘要本文首先通过VC++6.0创建异步通信界面,通过插入MSComm控件,用vspm虚拟串口实现串行异步通信,具体实现过程是先建立工程,然后在项目中插入MSComm控件,再通过布局,初始化串口,设置MSComm控件的属性,添加串口事件消息处理函数OnComm(),就可以发送数据,通过虚拟发送可以在同一界面上出现发送和接收消息,也可以互相发送消息,从而实现串行异步通信。关键词:串口通信;MSComm控件;VC++6.0目录TOC\o"1-2"\h\z\uHYPERLINK前言 1HYPERLINK第一章基本原理 3HYPERLINK1.1串口通信的基本概念 3HYPERLINK1.2串行通信的工作模式 3HYPERLINK1.3串行通信协议 4HYPERLINK1.4基本参数 5HYPERLINK第二章需求分析 6HYPERLINK2.1目的及意义 6HYPERLINK2.2设计任务及要求 6HYPERLINK第三章系统分析 6HYPERLINK3.1功能描述 6HYPERLINK3.2系统分析与设计 6HYPERLINK3.3串口通信协议设计 7HYPERLINK第四章系统设计及系统调试 9HYPERLINK4.1VC++的MicrosoftCommunicationsControl控件 9HYPERLINK4.2使用MSComm控件编程过程 9HYPERLINK4.3添加串口事件消息处理函数OnComm() 11HYPERLINK4.4发送及接收数据 12HYPERLINK第五章串口通信调试 13HYPERLINK5.1计算机串口设置 13HYPERLINK5.2虚拟串口 13HYPERLINK5.3设置串口大师 13HYPERLINK5.4用串口大师测试MSCommTest程序 14HYPERLINK总结 15HYPERLINK参考文献 16HYPERLINK附页:程序 17前言近些年随着通信技术与计算机技术的发展,通信技术和计算机技术出现了很大的融合性,从而出现了计算机通信,而串行异步通信作为最简单的计算机通信之一,有着广泛的应用价值,作为市场广泛的VC++当仁不让的成为了最通用的编程语言之一,其中我用VC++6.0通过建立工程等创立了用户界面,而vspm虚拟串口则通过改变端口号实现了串行异步通信,其中重要的是MSComm控件的插入和虚拟串口的设置,本文综合讨论了以上实现方案的可行性,并且通过大胆的实验,得到了可靠的成果。在通信领域内,有两种数据通信方式:并行通信和串行通信。随着计算机网络化和微机分级分布式应用系统的发展,通信的功能越来越重要。通信是指计算机与外界的信息传输,既包括计算机与计算机之间的传输,也包括计算机与外部设备,如终端、打印机和磁盘等设备之间的传输。随着通信技术和计算机网络技术的发展、Internet网的普及,计算机远程通信已渗透到国民经济的各个领域,而远程通信绝大多数采用串行通信的方式,所以了解和研究串行通信中的概念和技术有非常重要的意义。采用串行传输方式时,数据将按照顺序一位一位的在通信设备之间的一条通道上传输,由于设备内部往往以并行方式传输数据,所以在数据传至传输线路之前需先被送入发送端的串/并行转换器,通过这个转换器没数据将诸位传至线路上。而在数据到达目的地时,数据则需先进入接收端的串并行转换器实现逆转换过程,是数据传输从串行方式转换成并行方式,由于这种方式只需一个传输通道,因而它具有简单经济,易于实现的特点。

第一章基本原理1.1串口通信的基本概念串行通信是指通信的发送方和接收方之间数据信息的传输是在单根数据线上,串口通信协议设计思想基于帧传输方式,即在向串口发送数据时是一帧一帧地发送,以每次一个二进制的0、1为最小单位逐位进行传输,如图1.1所示。图1.1串行通信串行数据传送的特点是:数据传送按位顺序进行,最少只需要一根传输线即可完成,节省传输线。与并行通信相比,串行通信还有较为显著的优点:传输距离长,可以从几米到几千米;在长距离内串行数据传送速率会比并行数据传送速率快;串行通信的通信时钟频率容易提高;串行通信的抗干扰能力十分强,其信号间的互相干扰完全可以忽略。但是串行通信传送速度比并行通信慢得多,并行通信时间为T,则串行时间为NT。1.2串行通信的工作模式通过单线传输信息是串行数据通信的基础。数据通常是在两个站(点对点)之间进行传送,按照数据流的方向可分成3种传送模式:单工、半双工和全双工。(1)单工形式单工形式的数据传送是单向的。通信双方中,一方固定为发送端,另一方则固定为接收端。信息只能沿一个方向传送,使用一根传输线,如图2所示。单工形式一般用在只向一个方向传送数据的场合。例如,计算机与打印机之间的通信是单工形式,因为只有计算机向打印机传送数据,而没有相反的数据传送。还有在某些通信信道中,如单工无线发送等。图1.2单工形式(2)半双工形式半双工通信使用同一根传输线,既可发送数据又可接收数据,但不能同时发送和接收。在任何时刻只能由其中的一方发送数据,另一方接收数据。因此半双工形式既可以使用一条数据线,也可以使用两条数据线,如图1.3所示。图1.3半双工形式半双工通信中每端需有一个收/发切换电子开关,通过切换来决定数据向哪个方向传输。因为有切换,所以会产生时间延迟。信息传输效率低些。但是对于像打印机这样单方向传输的外围设备,用半双工方式就能满足要求了,不必采用全双工方式,可节省一根传输线。(3)全双工形式全双工数据通信分别由两根可以在两个不同的站点同时发送和接收的传输线进行传送,通信双方都能在同一时刻进行发送和接收操作,如图1.4所示。图1.4全双工形式在全双工方式中,每一端都有发送器和接收器,有两条传送线,可在交互式应用和远程监控系统中使用,信息传输效率较高。1.3串行通信协议串行通信协议分同步协议和异步协议。(1)异步通信协议的实例–起止式异步协议、特点与格式:起止式异步协议的特点是一个字符一个字符传输,并且传送一个字符总是以起始位开始,以停止位结束,字符之间没有固定的时间间隔要求。每一个字符的前面都有一位起始位(低电平,逻辑值0),字符本身有5~7位数据位组成,接着字符后面是一位校验位(也可以没有校验位),最后是一位,或意味半,或二位停止位,停止位后面是不定长度的空闲位。停止位和空闲位都规定为高电平(逻辑值),这样就保证起始位开始处一定有一个下跳沿。异步通信是按字符传输的,每传输一个字符,就用起始位来通知收方,以此来重新核对收发双方同步。若接收设备和发送设备两者的时钟频率略有偏差,这也不会因偏差的累积而导致错位,加之字符之间的空闲位也为这种偏差提供一种缓冲,所以异步串行通信的可靠性高。但由于要在每个字符的前后加上起始位和停止位这样一些附加位,使得传输效率变低了,只有约80%。因此,起止协议一般用在数据速率较慢的场合(小于19.2kbit/s)。在高速传送时,一般要采用同步协议。(2)面向字符的同步协议特点与格式:这种协议的特点是一次传送由若干个字符组成的数据块,而不是只传送一个字符,并规定了10个字符作为这个数据块的开头与结束标志以及整个传输过程的控制信息,它们也叫做通信控制字。由于被传送的数据块是由字符组成,故被称作面向字符的协议。数据透明的实现:面向字符的同步协议,不象异步起止协议那样,需要在每个字符前后附加起始和停止位,因此,传输效率提高了。同时,由于采用了一些传输控制字,故增强了通信控制能力和校验功能。协议应具有将特定字符作为普通数据处理的能力,这种能力叫做“数据透明”。为此,协议中设置了转移字符DLE(DataLinkEscape)。当把一个特定字符看成数据时,在它前面要加一个DLE,这样接收器收到一个DLE就可预知下一个字符是数据字符,而不会把它当作控制字符来处理了。DLE本身也是特定字符,当它出现在数据块中时,也要在它前面加上另一个DLE。这种方法叫字符填充。字符填充实现起来相当麻烦,且依赖于字符的编码。正是由于以上的缺点,故又产生了新的面向比特的同步协议。(3)面向比特的同步协议特点与格式:特点是所传输的一帧数据可以是任意位,而且它是靠约定的位组合模式,而不是靠特定字符来标志帧的开始和结束,故称“面向比特”的协议。帧信息的分段SDLC/HDLC的一帧信息包括以下几个场(Filed),所有场都是从有效位开始传送。1.4基本参数第二章需求分析2.1目的及意义随着多媒体技术,网络技术以及应用和信息技术的快速发展,使得计算机系统成为人们与外界联系,实现信息和资源共享的手段和工具。而这些技术实现的关键是基于计算机的通信技术的支持。在计算机与外部设备之间的通信方式中,由于串行接口方便使用简单,所以异步串行通信成为计算机通信的常用手段。而Windows以其多任务,的应用,VC,VB等开发平台提供了良好的可视化环境,而且是目前开发应用程序的强大,高效的开发平台之一。在C++6.0环境下,利用MSComm控件编程相对来说较简单,所以我们利用MSComm控件完成PC机件的串口通信。2.2设计任务及要求1)利用VC和VB来做用户界面,实现PC机的两个COM口实现异步通信,根据设置调整异步串行通信参数。2)学习VC或VB开发工具。3)利用MSComm控件完成PC机间的串口通信。4)掌握RS-232接口标准。第三章系统分析3.1功能描述本设计通过串口在两台计算机之间建立连接,按照自定义串口通信协议进行信息交换,通过串口实现聊天、文件传输的功能。3.2系统分析与设计系统架构方式如图2.1所示:图3.1串口通信软件结构3.3串口通信协议设计串口通信协议设计思想基于帧传输方式,即在向串口发送数据时是一帧一帧地发送。对于上层应用来说,应用程序所发送的和所接收的都是流式数据,即如果应用程序需要进行上层的协议解释的说,它将面对这些流数据的重新拼装。为保证可靠的传输,在传输开始前,通过握手建立连接,在每一帧的传输中,采用发送/应答/重连/失败方式。1帧格式此应用程序使用三种帧:控制帧、数据帧、语短语帧。控制帧与数据用于文件传输,短语帧用于短消息发送。(1)数据帧数据帧包括帧头、负载数据和校验和。帧头占6个字节,其中count表示负载数据长度(字节计算),Check1表示第二与第三字节的校验和。0123450x000x00CountCheck1数据帧头负载数据长count字节,最多不超过0x1000字节。校验和占两个字节,是对负载数据计算校验和的结果。(2)控制帧控制帧和控制信号合作完成通信同步与控制任务,他只是帧头,长为6字节。0123450x000x01nPackCheck1传输起始控制帧其中nPack表示本次传输共发送帧数,便于让接收方控制进度,Check1为第二与第三字节的校验和。当nPack=Check1=0时,表示本次传输结束,当接收方收到该帧时,不管是否已收到应接收帧数,都将结束此次传输(计该帧为ABORT帧)。在没有发生传输错误的情况下,一次传输只会出现两次控制帧,第一次在传输开始时(计为控制首帧),第二次在传输结束时。(3)短语帧短语帧相对简单,帧中负载均为文本数据。发送与接收该帧不需建立连接也没有错误控制,只是在帧头和帧尾插入了同步信号。0x03文本数据0x032.控制信号为提高通信效率,串口通信协议使用控制信号进行通信同步、纠错等各种控制任务。下面是串口通信协议定义的6种控制信号。constBYTESYN[1]={0x1};//请求constBYTEACK[1]={0x2};//响应constBYTERESEND[1]={0x4};//重发constBYTEBUSY[1]={0x7};//忙constBYTEBYE[3]={6,0,6};//断开连接constBYTESTR[1]={0x3};//短信息同步信号3.数据分帧及数据重组应用程序送过来的数据作为一个流按串口通信协议进行分帧,切割后为每个帧加上帧头和校验和,放入串口通信协议内部缓冲区内准备发送;在接收端,分帧的数据去掉帧头重新归到接收缓冲区流,由应用程序接收。4.传输流程在发送数据前,串口通信协议发送方将应用程序希望发送的数据进行分帧,然后按下面的步骤进行通信。(1)握手a.由发送端发SYN信号,等待反馈。b.接收端收到SYN信号后发回ACK信号。c.发送端收到ACK信号后,由发送端发出控制首帧。d.接收端收到控制首帧后,CHECKSUM错误则发RESEND信号,然后重复步骤c~d。如果正确,发ACK信号。e.发送端收到ACK信号后,转到(2)数据传输的步骤a。(2)数据传输a.由发送端发送第i帧的帧头,等待反馈;若发送方发现该帧是ABORT帧,则转到(3)断开连接的步骤a。b.接收端收到帧头后,帧长度校验和错误则发RESEND信号,然后重复步骤a~b。如果正确,发ACK信号。c.若发送端收到ACK信号,则发送帧中数据和校验和。d.接收端收到数据后,负载数据校验和错误则发RESEND信号,然后重复步骤c~d。如果正确,发ACK信号。e.若发送端收到ACK信号,则该帧数据发送成功。发送端发送SYN信号,开始下一帧的握手过程。f.若接收端收到SYN信号,则发送ACK信号进行确认。g.若发送端接收到ACK信号,则重复a~e步骤进行下一帧的传输。(3)断开连接a.发送方发送ABORT控制帧,准备结束此次通信。b.若接收端收到ABORT信号,则发送ACK信号,准备结束此次通信。c.若发送端收到ACK信号,则发送BYE控制信号。d.若接收方收到BYE信号,则拆除此次连接,同时发送ACK信号。e.发送方收到ACK信号后,拆除连接。第四章系统设计及系统调试4.1VC++的MicrosoftCommunicationsControl控件4.2使用MSComm控件编程过程4.2.1建立工程打开VC++6.0建立基于对话框的MFC应用程序12250218,如图4.1所示。

图4.14.2.2在项目中插入MSComm控件工程->增加到工程->ComponentsandControls->双击RegisteredActiveXControls->选择MicrosoftCommunicationsControl,version6.0->Insert,按默认值添加,多了个电话图标,这是增加后串口通信控件。如图3.2-图3.3所示。图4.2图3.7图4.34.2.3布局删除确认、取消和提示框,添加“电话”、静态文本、按钮、编辑框,拖动添加的控件,根据喜好布局如图4.4所示。图4.44.2.4初始化串口:设置MSComm控件的属性查看->建立类向导MFCClassWizard->MemberViariable,选择ClassName为CmytestDlg的类,ControlID为MSCOMM1,双击它,为它添加控制变量m_ctrlComm类似的,选择其它项修改,改后如图4.5所示。图4.5对CMytestDlg::OnInitDialog()函数中写入对串口的初始化语句,串口初始化语句由IDC_MSCOMM1的CMSComm控制变量m_ctrlComm来设置串口控件属性。4.3添加串口事件消息处理函数OnComm()查看->建立类向导MFCClassWizard->MessageMaps,在ClassName中选择类CmytestDlg,再在ObjectIDs中选择IDC_MSCOMM1,然后在Message中双击消息OnCom,在弹出的对话框中将函数名改为OnComm(好记),单击“OK”,就加入了串口事件的消息处理函数,如图4.6:图4.6然后编写OnComm()中的代码,主要任务是从串口接收数据并显示在接收编辑框中。4.4发送及接收数据发送数据先为发送按添加一个单击消息,即BN_CLICKED处理函数,打开ClassWizard->MessageMaps,选择类CMytestDlg,选中IDC_BUTTON_MANUALSEND,双击BN_CLICKED添加OnButtonManualsend()函数,如图4.7.图4.7

第五章串口通信调试5.1计算机串口设置进入Windows中“我的电脑”系统属性,在“设备管理器”列表中有端口COM和LPT设备信息,选中通信端口COM1,查看其属性,在COM1端口属性的端口设置选项中,将其波特率(即每秒位数)设为9600,停止位设为1如图5.1所示,并将COM1改为COM30,释放COM1已被所用。其代码为:图5.15.2虚拟串口有时,也会有这种情况,我们使用的计算机上一个串口也没有,或者串口被其他设备占用。由于串口具有独占性,如果被其他设备占用,那么就不能由我们编写的程序来控制。但这时我们身边没有或不方便使用其他计算机,那么使用第三方软件提供的虚拟串口可以很好地解决这个问题。虚拟串口本身是不存在的,而是由软件模拟出来的,不能像真实的物理串口一样实现与其他计算机或设备上的串口直接通信。5.3设置串口大师打开“串口大师”软件,设置串口号为COM2、波特率9600、校验位NO、数据位8、停止位1等参数(注意:设置的参数必须与仪器设置的一致),打开串口,如其代码为:图5.2所示。图5.25.4用串口大师测试MSCommTest程序运行MSCommTest程序,在发送框内COM1输入“我是好孩子”再点击“发送”,观察串口大师软件的接收框,发现可以准确无乱码地接收到;其代码为:在串口大师接受COM2框内收到“我是好孩子”,如图5.3所示:图5.3对方收到信息回复,在发送框内COM2输入“你们对我挺好”再点击“发送”,观察串口大师软件的接收框,发现可以准确无乱码地接收到;在串口大师接受框内COM1收到“你们对我挺好”如图5.4所示:图5.4图5.4图5.5总结通过上述测试,本系统成功地实现了数据发送、自动发送、清空接收到的数据,以及十六进制发送与显示这些功能,由于数据发送会受一些因素的影响,因此在发送数据时有时会存在明显的延迟。本次课程设计,在VC++6.0平台下,利用MSComm控件编写串口通信程序,实现了串口通信发送数据、自动发送、十六进制发送与显示、清空接收区的功能。用MSComm控件完成的,这种方法程序比较简单,还可以调用Windows的API函数,这种方法可以清楚地掌握串口通信的机制,相对比较自由灵活,串口通信中还有同步与异步串口通信之分,由于时间和知识的有限,这次我只做一比较容易学会的控件法。通过查找资料还知道串行通信也可以用VB,C语言,C#完成,所以感觉到知识的无限,如果想在这方面有更深的造诣,还得不断地学习新知识,不断地实践。在此感谢王老师的悉心指导和相关同学们的帮助,使我感受到了学习的乐趣。参考文献[1]杨永田.计算机通信.哈尔滨:哈尔滨工程大学出版社,2002[2]韩毅刚.计算机通信技术.北京市:北京航空航天大学出版社,2007[3]李鹏.计算机通信技术及其程序设计.西安:西安电子科技大学出版社,1999.6[4](美)史蒂芬(Stevens,A.),林丽闽译.标准C++宝典[M].北京:电子工业出版社,2001[5]王莉,阳春华.基于VC++的串口通信设计及其应用[J].控制工程,2004[6]王华,岳丽全,岳志高.MSComm控件在VC++6.0串口通信中的应用.长春工程学院学报:自然科学版,2009[7]龚建伟,熊光明.VisualC++/TurboC串口通信编程实践[M].电子工业出版社.2004附页:程序//mscommDlg.cpp:implementationfile//#include"stdafx.h"#include"mscomm.h"#include"mscommDlg.h"#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CAboutDlgdialogusedforAppAboutclassCAboutDlg:publicCDialog{public: CAboutDlg();//DialogData //{{AFX_DATA(CAboutDlg) enum{IDD=IDD_ABOUTBOX}; //}}AFX_DATA //ClassWizardgeneratedvirtualfunctionoverrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport //}}AFX_VIRTUAL//Implementationprotected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg():CDialog(CAboutDlg::IDD){ //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT}voidCAboutDlg::DoDataExchange(CDataExchange*pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg,CDialog) //{{AFX_MSG_MAP(CAboutDlg) //Nomessagehandlers //}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CMscommDlgdialogCMscommDlg::CMscommDlg(CWnd*pParent/*=NULL*/) :CDialog(CMscommDlg::IDD,pParent){ //{{AFX_DATA_INIT(CMscommDlg) m_recv1=_T(""); m_send1=_T(""); m_recv2=_T(""); m_send2=_T(""); //}}AFX_DATA_INIT //NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32 m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);}voidCMscommDlg::DoDataExchange(CDataExchange*pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMscommDlg) DDX_Control(pDX,IDC_MSCOMM2,m_mscom2); DDX_Control(pDX,IDC_MSCOMM1,m_mscom1); DDX_Text(pDX,IDC_COM1_RECEIVE,m_recv1); DDX_Text(pDX,IDC_COM1_SEND,m_send1); DDX_Text(pDX,IDC_COM2_RECEIVE,m_recv2); DDX_Text(pDX,IDC_COM2_SEND,m_send2); //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CMscommDlg,CDialog) //{{AFX_MSG_MAP(CMscommDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BTN_COM1SEND,OnBtnCom1send) ON_BN_CLICKED(IDC_BTN_COM1DELETE,OnBtnCom1delete) ON_BN_CLICKED(IDC_BTN_COM2DELETE,OnBtnCom2delete) ON_BN_CLICKED(IDC_BTN_COM2SEND,OnBtnCom2send) //}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////////CMscommDlgmessagehandlersBOOLCMscommDlg::OnInitDialog(){ CDialog::OnInitDialog(); //Add"About..."menuitemtosystemmenu. //IDM_ABOUTBOXmustbeinthesystemcommandrange. ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX<0xF000); CMenu*pSysMenu=GetSystemMenu(FALSE); if(pSysMenu!=NULL) { CStringstrAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if(!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu); } } //Settheiconforthisdialog.Theframeworkdoesthisautomatically //whentheapplication'smainwindowisnotadialog SetIcon(m_hIcon,TRUE); //Setbigicon SetIcon(m_hIcon,FALSE); //Setsmallicon //TODO:Addextrainitializationhere//初始化COM1 m_mscom1.SetCommPort(1);//串口1m_mscom1.SetInBufferSize(1024);//设置输入缓冲区的大小,Bytesm_mscom1.SetOutBufferSize(512);//设置输入缓冲区的大小,Bytes if(!m_mscom1.GetPortOpen())//打开串口 { m_mscom1.SetPortOpen(true); } m_mscom1.SetInputMode(1);//设置输入方式为二进制方式 m_mscom1.SetSettings("9600,n,8,1");//设置波特率等参数 m_mscom1.SetRThreshold(1);//为1表示有一个字符即引发事件 m_mscom1.SetInputLen(0);//初始化COM2 m_mscom2.SetCommPort(2);//串口2m_mscom2.SetInBufferSize(1024);//设置输入缓冲区的大小,Bytesm_mscom2.SetOutBufferSize(512);//设置输入缓冲区的大小,Bytes if(!m_mscom2.GetPortOpen())//打开串口 { m_mscom2.SetPortOpen(true); } m_mscom2.SetInputMode(1);//设置输入方式为二进制方式 m_mscom2.SetSettings("9600,n,8,1");//设置波特率等参数 m_mscom2.SetRThreshold(1);//为1表示有一个字符即引发事件 m_mscom2.SetInputLen(0); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}voidCMscommDlg::OnSysCommand(UINTnID,LPARAMlParam){ if((nID&0xFFF0)==IDM_ABOUTBOX) { CAboutDlgdlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID,lParam); }}//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,//thisisautomaticallydoneforyoubytheframework.voidCMscommDlg::OnPaint(){ if(IsIconic()) { CPaintDCdc(this);//devicecontextforpainting SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0); //Centericoninclientrectangle intcxIcon=GetSystemMetrics(SM_CXICON); intcyIcon=GetSystemMetrics(SM_CYICON); CRectrect; GetClientRect(&rect); intx=(rect.Width()-cxIcon+1)/2; inty=(rect.Height()-cyIcon+1)/2; //Drawtheicon dc.DrawIcon(x,y,m_hIcon); } else { CDialog::OnPaint(); }}//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags//theminimizedwindow.HCURSORCMscommDlg::OnQueryDragIcon(){ return(HCURSOR)m_hIcon;}BEGIN_EVENTSINK_MAP(CMscommDlg,CDialog)//{{AFX_EVENTSINK_MAP(CMscommDlg) ON_EVENT(CMscommDlg,IDC_MSCOMM1,1/*OnComm*/,OnCommMscomm1,VTS_NONE) ON_EVENT(CMscommDlg,IDC_MSCOMM2,1/*OnComm*/,OnCommMscomm2,VTS_NONE) //}}AFX_EVENTSINK_MAPEND_EVENTSINK_MAP()//MSComm1控件发出OnComm事件的响应函数,在该函数中读取串口字符串voidCMscommDlg::OnCommMscomm1(){ //TODO:Addyourcontrolnotificationhandlercodehere UpdateData(TRUE); //定义一些临时变量 VARIANTvariant_inp; COleSafeArraysafearray_inp;longi=0; intlen; BYTErxdata[1000]; switch(m_mscom1.GetCommEvent()) { case2://表示接收缓冲区内有字符 { //读取缓冲区数据variant_inp=m_mscom1.GetInput(); //将VARIANT型变量值赋给ColeSafeArray类型变量 safearray_inp=variant_inp; //获得数据长度 len=safearray_inp.GetOneDimSize(); //将数据保存到字符数组中 for(i=0;i<len;i++) {safearray_inp.GetElement(&i,&rxdata[i]); }//字符串结束 rxdata[i]='\0'; } m_recv1+=rxdata;UpdateData(false); break; default: break; }}//CO

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论