vs2013的mfc开发上位机

本人之前从未接触MFC编程,由于项目需要,所以上网查阅了相关资料,并实现了上位机串口通信。由于网上的资料还不够详细,本人决定写一个图文并茂的详细教程。因为本人只是初学,如有错误,欢迎指点。

开发环境是:VS2013

串口编程方法:32位控件

参考资料:https://www.cnblogs.com/codecamel/p/5075675.html

首先

:先安装几个插件MSCOMM.SRG、MSCOMM32.DEP、MSCOMM32.oca、mscomm32.ocx;
插件下载连接:microsoft communication controls versions 6.0
解压后拷贝到:

C:\Windows\System32(32位操作系统);
C:\Windows\SysWOW64(64位操作系统);
以管理员身份打开CMD命令(如果是win10,可以直接在小娜里面搜索cmd,然后以管理员方式运行),执行如下命令,注册mscomm32.ocx控件:

regsvr32 c:\windows\System32\MSCOMM32.OCX (32位系统)

regsvr32 c:\windows\SysWOW64\MSCOMM32.OCX (64位系统)

出现如下图就代表成功了
成功截图

第一步:新建工程

运行VS2013,文件-〉新建->项目,选择MFC应用程序 ,工程名称:ShangWeiJi,目录最好没中文。确定
在这里插入图片描述
然后下一步
在这里插入图片描述
然后点基于对话框,然后在下一步,
在这里插入图片描述
继续下一步
在这里插入图片描述
继续下一步
在这里插入图片描述
这里选择结尾为Dlg的,然后点击完成
在这里插入图片描述
出现如下
在这里插入图片描述

第二步:插入控件

点击对话框,在按住ctrl+A全选删除当前的控件
在这里插入图片描述
然后在对话框上点击右键->插入ActiveX控件(X),
在这里插入图片描述
然后在里面找到:microsoft communication controls versions 6.0,然后点击确定

在这里插入图片描述
然后就会看到控件上有个电话的图标,
在这里插入图片描述
接下来我们去除多余的白边,右击控件,然后点击编辑控件,
在这里插入图片描述
然后在点击一下空白地方,白边就没了,然后编译一下看是否有错误
在这里插入图片描述

第三步: 填加图标

点击右上角的工具箱
在这里插入图片描述
出现如下,接下来我们拖拽一个Button,一个Edit Control,一个Group Box,一个Static Text
在这里插入图片描述
如下图已经添加好了的
在这里插入图片描述

第四步:界面布局及显示

4.1 界面布局

接下来我们进行布局,先将Staic框给拖大
单击Static框,然后将static移到左上角,然后拖住右下角边缘黑点至整个文本框,如下图
在这里插入图片描述
再次单击Static框,然后直接输入文字“串口助手”,然后点击回车,得到如下图

在这里插入图片描述
然后接下来将示例文本框拖成如下图,
在这里插入图片描述

然后单击选中示例编辑框,然后按住ctrl+鼠标左键,在再下拖拽就可复制一个示例编辑框,如下图

在这里插入图片描述
接下来,我们修改Button按键(我这里是Button3,你们的应该是Button1,不影响,都是一样的)
单击Button3,然后按住ctrl+鼠标左键,在再下拖拽就可复制一个Button出来

在这里插入图片描述
同时在复制一个Static出来
在这里插入图片描述
将两个Static分别拖拽到两个示例编辑框左上角,然后利用对齐工具使界面上图标排的好看,整齐,对齐工具位置在(需同时选中两个或两个以上才能对齐,对齐参照是黑点重一些的那个)

在这里插入图片描述
下图是我自己排版的
在这里插入图片描述

4.2更改图标显示

接下来单击各个图标进行更改提示,改成如下图,更改方法:单击需要更改的图标,然后直接输入需要更改的文字
在这里插入图片描述
这里我们还需要将接收消息的示例编辑框设置为不可编辑
选中接收消息的编辑框,然后点击右键,然后点击属性,出现如下
在这里插入图片描述
接下来将这5个地方进行更改
在这里插入图片描述
然后就会看到文本框变成了背景色,同时多了滑动条
在这里插入图片描述

第五步:更改id以及添加变量

5.1 修改id

单击接收信息的示例编辑框,然后点击属性,点进去
在这里插入图片描述
将此处ID改为IDC_EditRxData
在这里插入图片描述
在这里插入图片描述
然后将接收信息示例编辑框改为IDC_EditTxData,将打开串口改为IDC_BtnOpen,将发送数据修改为IDC_BtnSend,

在这里插入图片描述
然后在界面上单击右键,点击类向导->成员变量,可看到我们已经改好的id
在这里插入图片描述

5.2 添加变量

接下来我们对图标进行添加变量,点击选中IDC_BtnOpen,然后点击右边的添加变量
在这里插入图片描述
然后将访问改为private,变量名设置为m_BtnOpen,然后点击完成。接下来用一样的方法完成IDC_BtnSend添加变量,变量名为m_BtnSend

在这里插入图片描述
两个设置好之后的完成图
在这里插入图片描述
接下来点击IDC_EditRxData,然后添加变量,然后选择类别为value变量类型为CString (这里跟上面有一点点不同,注意一下),访问仍然是private,变量名为m_EditRxData,下面是选好的图,然后点击完成,然后完成IDC_EditTxData的添加变量,方法和IDC_EditRxData一样,IDC_EditTxData变量名为m_EditTxData
在这里插入图片描述
接下来就差添加我们串口控件(IDC_MSCOMM1)的变量了
同样,先选中IDC_MSCOMM1->添加变量,访问设为private,变量名为m_Comm1,别的不用设置,然后点击完成

在这里插入图片描述
变量添加完成图,然后点击确定。然后再编译一下看看是否能运行,
在这里插入图片描述
我的运行截图
在这里插入图片描述

第六步添加打开串口按钮以及发送数据按钮的事件

6.1 串口初始化配置

双击《打开串口》按钮进入如下图,
在这里插入图片描述
复制下面的代码替换串口按钮函数

void CShangWeiJiDlg::OnBnClickedBtnopen()
{
	// TODO:  在此添加控件通知处理程序代码
	if (m_Comm1.get_PortOpen())
		m_Comm1.put_PortOpen(FALSE);

	m_Comm1.put_CommPort(6); //选择com6,可根据具体情况更改
	m_Comm1.put_InBufferSize(1024); //设置输入缓冲区的大小,Bytes
	m_Comm1.put_OutBufferSize(1024); //设置输入缓冲区的大小,Bytes//
	m_Comm1.put_Settings(TEXT("115200,n,8,1")); //波特率115200,无校验,8个数据位,1个停止位
	m_Comm1.put_InputMode(1); //1:表示以二进制方式检取数据
	m_Comm1.put_RThreshold(1);
	//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
	m_Comm1.put_InputLen(0); //设置当前接收区数据长度为0
	if (!m_Comm1.get_PortOpen())
		m_Comm1.put_PortOpen(TRUE);//打开串口
	else
		AfxMessageBox(TEXT("cannot open serial port"));
	m_Comm1.get_Input();//先预读缓冲区以清除残留数据

	m_BtnOpen.SetWindowText(TEXT("关闭串口"));//将打开串口按钮换成关闭串口
	UpdateData(false);
}

6.2发送按钮事件

点击左下角的资源视图,然后点击《IDD_SHANGWEIJI_DIALOG》,我们就回到了我们编辑的界面,接下来双击发送数据编辑发送数据按钮的函数

在这里插入图片描述
我们将发送数据的函数改为如下

void CShangWeiJiDlg::OnBnClickedBtnsend()
{
	// TODO:  在此添加控件通知处理程序代码
	UpdateData(TRUE); //读取编辑框内容
	m_Comm1.put_Output(COleVariant(m_EditTxData));//发送数据
}

在这里插入图片描述

6.3 串口处理事件

接下来在根据上面的方法回到我们设置的界面,然后添加串口控件的处理函数,
选中“电话”图标点击鼠标右键->属性,然后点击闪电出现如下图
在这里插入图片描述
点击OnComm,出现向下的箭头,点击箭头,选中OnCommMscomm1,
在这里插入图片描述
然后就跳转到了他的函数下
在这里插入图片描述
将此函数换成如下

void CShangWeiJiDlg::OnCommMscomm1()
{
	// TODO:  在此处添加消息处理程序代码
	VARIANT variant_inp;
	COleSafeArray safearray_inp;
	LONG len, k;
	BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
	CString strtemp;
	if (m_Comm1.get_CommEvent() == 2) //事件值为2表示接收缓冲区内有字符
	{             以下你可以根据自己的通信协议加入处理代码
		variant_inp = m_Comm1.get_Input(); //读缓冲区
		safearray_inp = variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
		len = safearray_inp.GetOneDimSize(); //得到有效数据长度
		for (k = 0; k < len; k++)
			safearray_inp.GetElement(&k, rxdata + k);//转换为BYTE型数组
		for (k = 0; k < len; k++) //将数组转换为Cstring型变量
		{
			BYTE bt = *(char*)(rxdata + k); //字符型
			strtemp.Format(_T("%c"), bt); //将字符送入临时变量strtemp存放
			m_EditRxData += strtemp; //加入接收编辑框对应字符串 
		}
	}
	//UpdateData(FALSE); //更新编辑框内容
	SetDlgItemText(IDC_EditRxData, m_EditRxData);//不使用UpdateData(FALSE);的原因是该函数会
	//刷新整个对话框的数据,而SetDlgItemText()
	//只更新接收编辑框的数据。
}

接下来我们就可以运行试试效果了
效果图
在这里插入图片描述
然后对应的程序包就在自己创建项目的目录下的Debug里面

最后:细节处理

接下来可以优化一些细节,比如程序运行的时候点击回车就会退出,解决办法,如下图,然后点击OnOk,然后点击往下的箭头,然后点击OnOk
在这里插入图片描述
出现如下
在这里插入图片描述
接下来将OnOK()函数换为下面的就好了

void CShangWeiJiDlg::OnOK()
{
	// TODO:  在此添加专用代码和/或调用基类

	OnBnClickedBtnsend();//调用发送按钮函数,从而使回车按钮的作用为发送数据
	//CDialogEx::OnOK();
}

然后在运行就会发现回车就是发送了,后面的细节我还未进行处理,处理好了我会发出来的,比如串口只能打开之后就不能关闭了,比如不能在软件上设置波特率之内的。

这个是我写好的程序的连接,用的是VS2013:

  • 10
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值