您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 用MFC的MSComm控件编写串口通信助手1.0beta
xinzrjay原创,转载需注明,欢迎分享学习。xinzrjay@qq.comQQ:14729560111用MFC的MSComm控件编写串口通信助手1.0beta首先说明:1.本教程是作者辛苦学习之后写出来的,学之前都觉得很难,MFC忘了好几年了,串口通信也不是很懂。但是现在觉得很简单了,因为用MFC编写东西,很多时候并不需要具体了解底层,知道一些类,函数就可以了。网站这样的教程一大堆,很多牛人N年前都已经玩熟了。2.本人主要借鉴的是龚建伟的《VisualVisualVisualVisualC++/TurboC++/TurboC++/TurboC++/TurboCCCC串口通信编程实践》这本书,真的很不错,大家可以去借来看看,基本可以无视我的东西了。之所以写这个是因为网上好多都太省略了,而且界面什么的都不是我想要的。3.由于是1.0的版本,功能很弱,写的也尽可能的详细,以后有时间会写后续版本,当然不会这样详细了。4...............................好!Let'sbegin!!!!!首先,打开VC6.0,新建一个MFC工程,我们命名为SCommTest。确定。选择程序类型为基本对话框。xinzrjay原创,转载需注明,欢迎分享学习。xinzrjay@qq.comQQ:14729560112下一步,因为是单对话框没有菜单,所以关于对话框可以不要。xinzrjay原创,转载需注明,欢迎分享学习。xinzrjay@qq.comQQ:14729560113下面的不用改,一直下一步,或者直接完成即可。好了,一个简单的对话框默认界面生成了。看看是不是这样的?我们删掉原来的两个按钮和一个静态文本,在标题栏上右键属性,然后更改标题名称为自己喜欢的,我写的是串口通信助手1.0beta。默认是小五的字体也比较小,可以改大点。注意字体改变后整个界面也变大了,所以最好现在就改,以后界面布局弄好之后再改就还要重新布局。下面就开始画我们程序的界面啦!开始!首先画两个组框,分别为显示区和发送区。然后在显示区内部画一个编辑框,ID改为IDC_EDIT_RECV。样式更改如下:xinzrjay原创,转载需注明,欢迎分享学习。xinzrjay@qq.comQQ:14729560114好,下面再在发送区内画一个编辑框,ID改为IDC_EDIT_SEND,样式更改如下:最后画一个发送按钮就大功告成啦!按钮ID改为IDC_BUTTON_SEND。好,运行下看看!当然什么功能都没有,只是有个界面。最终界面如下:xinzrjay原创,转载需注明,欢迎分享学习。xinzrjay@qq.comQQ:14729560115下面我们要为工程添加一个MScomm控件,就是这个控件为我们完成串口通信的功能。点开ComponentsandControls,等一下,就会出现下面的界面xinzrjay原创,转载需注明,欢迎分享学习。xinzrjay@qq.comQQ:14729560116我们选择第一个文件夹,选择MicrosoftCommunicationsControls,version6.0。然后insert,弹出的对话框中选择确认,再弹出的对话框中选OK,最后关闭。这里要注意的是,如果没有在RegisteredActiveXControls中找到MicrosoftCommunicationsControls,可能是你安装的VC6过于精简,或者安装的时候没有选择ActiveX选项,如果是后者,则选择修复安装,把选项选上即可。安装好控件后,在控件栏最下面会多出一个电话一样的控件,就是MSComm控件啦!把它拖出来放到空白处即可,这个控件在程序运行时是不会显示的。xinzrjay原创,转载需注明,欢迎分享学习。xinzrjay@qq.comQQ:14729560117好了,界面完成之后就可以添加代码了,但是首先我们还得添加变量和函数。首先添加变量,选择查看-建立类向导然后按下图添加变量接下来添加函数首先为MSComm控件添加一个函数OnComm,主要用于接收串口发送来的消息然后为发送按钮添加一个函数OnButtonSend,主要用于给串口发送消息。添加的方式是双击控件,修改函数名称,确认即可。如下两图:xinzrjay原创,转载需注明,欢迎分享学习。xinzrjay@qq.comQQ:14729560118好,下面就可以添加代码了,注意哦,这是最细致的部分。有的代码可能不太明白是什么意思,以后逐渐就知道了。首先,要记住,工程中有好几个CPP文件和H头文件,但是我们要添加的代码,都是写在SCommTestDlg.CPP文件中的。xinzrjay原创,转载需注明,欢迎分享学习。xinzrjay@qq.comQQ:147295601191.我们在OnInitDialog()中添加初始化语句,用于设置串口通信的属性和打开串口。BOOLCSCommTestDlg::OnInitDialog(){........//TODO:Addextrainitializationhere//---------------------------------------------------------------------------//---------------------------------------------------------------------------//添加的对串口的初始化语句if(m_cComm.GetPortOpen())//如果发现串口本来是打开的,则关闭串口m_cComm.SetPortOpen(FALSE);m_cComm.SetCommPort(1);//选择COM1端口m_cComm.SetInputMode(1);//输入方式为二进制方式m_cComm.SetInBufferSize(1024);//设置输入缓冲区m_cComm.SetOutBufferSize(512);//设置输出缓冲区m_cComm.SetSettings(9600,n,8,1);//波特率9600,无校验,8个数据位,1个停止位if(!m_cComm.GetPortOpen()){m_cComm.SetPortOpen(TRUE);//打开串口m_cComm.SetRThreshold(1);//每当接收缓冲区有1个字符则接收串口数据m_cComm.SetInputLen(0);//设置当前缓冲区长度为0m_cComm.GetInput();//预读缓冲区以清除残留数据}elseAfxMessageBox(打开端口失败!,MB_ICONSTOP,0);//---------------------------------------------------------------------------//---------------------------------------------------------------------------returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}2.我们在OnComm()函数中添加对串口发送过来的数据处理过程voidCSCommTestDlg::OnComm(){//TODO:Addyourcontrolnotificationhandlercodehere//---------------------------------------------------------------------------//---------------------------------------------------------------------------//从串口接收数据并显示在编辑框中VARIANTvariant_inp;COleSafeArraysafearray_inp;longlen,k;byterxdata[512];//设置BYTE数组CStringstrtemp;if(m_cComm.GetCommEvent()==2)//值为2表示接收缓冲区内有字符{variant_inp=m_cComm.GetInput();//读缓冲区消息xinzrjay原创,转载需注明,欢迎分享学习。xinzrjay@qq.comQQ:147295601110safearray_inp=variant_inp;///变量转换len=safearray_inp.GetOneDimSize();//得到有效的数据长度for(k=0;klen;k++)safearray_inp.GetElement(&k,rxdata+k);for(k=0;klen;k++)//将数组转换为CString型变量{charbt=*(char*)(rxdata+k);//字符型strtemp.Format(%c,bt);//将字符送入临时变量strtemp存放m_strRecvData+=strtemp;//加入接收编辑框对应字符串}}CStringtemp=(\r\n);//显示完成后要自动换行m_strRecvData+=temp;UpdateData(FALSE);//更新编辑框内容//---------------------------------------------------------------------------//---------------------------------------------------------------------------}3.我们添加发送按钮OnButtonSend()发送数据的过程voidCSCommTestDlg::OnButtonSend(){//TODO:Addyourcontrolnotificationhandlercodehere//---------------------------------------------------------------------------//---------------------------------------------------------------------------//单击发送按钮的操作UpdateData(true);//读取编辑框内容m_cComm.SetOutput(COleVariant(m_strSendData));//发送数据m_strSendData.Empty();//发送后清空输入框UpdateData(false);//更新编辑框内容//对发送的数据进行强制类型转换,由CString字符串数据转换为VARIANT类型。//---------------------------------------------------------------------------//---------------------------------------------------------------------------}好啦!简单吧!代码其实并不长,当然这是在功能很简单的情况下。让我们运行一下看看!没错的话就OK啦!这里大家可能要问了,如果我身边没有串口怎么测试呢?非常简单,用一根细铁丝将自己电脑后面的串口的2—3口短接起来,就可以实现自发自收啦!下面就来检验下我们自己写的小程序吧!xinzrjay原创,转载需注明,欢迎分享学习。xinzrjay@qq.comQQ:147295601111这里我们发现,尽管我们发送的数据是一长串,但是串口给我们发送回来的有时却是8个或8个的N倍为一组的,这是串口自己传输的时候进行的分段,如果不喜欢可以在接收的时候不自动加入回车符即可!这里还有一个问题,如果你把写好的程序,就是debug下的exe文件传给同学,如果他的电脑没有装VC++,你会惊奇的发现这个程序是打不开的!这该怎么办呢?难道为了这个小小的程序还要装个VC??当然不用了。这是因
本文标题:用MFC的MSComm控件编写串口通信助手1.0beta
链接地址:https://www.777doc.com/doc-6126789 .html