vs2010进行MFC的串口通信

综述:之前没有进行过MFC的使用,今天就来进行一个简单的MFC入门:串口通信。相信大家都用过串口调试工具,今天我们就来自己写一写。

一、建立MFC程序

建立一个MFC应用程序
在这里插入图片描述
选择基于对话框,其他默认。

二、界面设置

界面设置如下:
在这里插入图片描述
在这里我用了2个Group Box当框架,修改caption就可以直接改显示的标题,然后在这2个Group Box里面添加了Edit Control,vertical Scroll 设置滚动框。2个下拉框Combo Box,上面可以加一个Static Text进行说明,后面还有4个Button最后就是最重要的一个控件MSComm控件。可以右键插入ActiveX控件。

三、MSComm控件

在这里插入图片描述
这个控件Microsoft Communications Control,version 6.0(SP6),如果没有的话就手动安装。

http://xiazai.zol.com.cn/detail/47/468794.shtml
https://www.ocxme.com/files/mscomm32_ocx

mscomm32.ocx在这个网站上能够下载。下完解压后就是MSCOMM32.OCX,把它放在C:\Windows\system32目录。这个文件下就有cmd.exe,直接右键管理员权限打开cmd窗口,输入指令regsvr32 MSCOMM32.OCX即可,然后会弹出注册成功。
网上有些教程还有一步是修改注册表,不过我发现regsvr32命令已经修改了注册表,无需手动修改。

四、参数以及代码设计

首先肯定是添加变量的,可以直接点Edit Control,然后右键添加变量,当然也可以直接写。

	CString e_editReceive;
	CString e_editSend;
	CComboBox e_combo1;
	CComboBox e_combo2;
	CMscomm1 e_mscomm1;

我是这样定义的。然后就是实现我需要的这4个功能:打开串口,发送数据,清除数据,退出。双击button跳转之后就可以直接写代码。

打开串口代码如下:

void CsortDlg::OnBnClickedButtonOpen()			//打开串口
{
	// TODO: 在此添加控件通知处理程序代码
	CString str,str1,n;
	GetDlgItemText(IDC_BUTTON_Open,str);
	CWnd *h1;
	h1 = GetDlgItem(IDC_BUTTON_Open);			//指向控件的caption

	if(!e_mscomm1.get_PortOpen())
	{
		e_combo2.GetLBText(e_combo1.GetCurSel(),str1);		//取得所选字符串放在str1里面
		str1 = str1+','+'n'+','+'8'+','+'1';				// 

		e_mscomm1.put_CommPort(e_combo1.GetCurSel()+1);		//选择串口
		e_mscomm1.put_InputMode(1);							//二进制
		e_mscomm1.put_Settings(str1);						//参数“波特率,n,8,1”
		e_mscomm1.put_InputLen(1024);						//设置并返回Input属性从接收缓冲区读取的1024个字符
		e_mscomm1.put_RThreshold(1);						//接收缓冲区收到一个字符就会使得CMSComm控件产生OnComm消息
		e_mscomm1.put_RTSEnable(1);							//确定RTS是否有效,请示允许发送数据

		e_mscomm1.put_PortOpen(true);
		if(e_mscomm1.get_PortOpen())
		{
			str = _T("关闭串口");
			UpdateData(true);
			h1->SetWindowText(str);
		}
		else
		{
			e_mscomm1.put_PortOpen(false);
			if(str != _T("打开串口"))
			{
				str = _T("打开串口");
				UpdateData(true);
				h1->SetWindowText(str);
			}
		}
	}
}

发送数据代码如下:

void CsortDlg::OnBnClickedButtonSend()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(true);
	e_mscomm1.put_Output(COleVariant(e_editSend));
}

清除数据代码如下:

void CsortDlg::OnBnClickedButtonClear()
{
	// TODO: 在此添加控件通知处理程序代码
	e_editReceive = _T("");
	UpdateData(false);
}

退出代码如下:

void CsortDlg::OnBnClickedButtonQuit()
{
	// TODO: 在此添加控件通知处理程序代码
	if(e_mscomm1.get_PortOpen())
		e_mscomm1.put_PortOpen(false);
	CDialogEx:OnCancel();
}

在前面BOOL CsortDlg::OnInitDialog()的初始化里面添加额外的代码:

//串口选择组合框
	CString str;
	int i;
	for(i=0;i<15;i++)
	{
		str.Format(_T("com %d"),i+1);
		e_combo1.InsertString(i,str);
	}
	e_combo1.SetCurSel(0);  

	//波特率选择组合框
	CString str1[]={_T("300"),_T("600"),_T("1200"),_T("2400"),_T("4800"),_T("9600"),
		_T("19200"),_T("38400"),_T("43000"),_T("56000"),_T("57600"),_T("115200")};
	for(int i=0;i<12;i++)
	{
		int judge_tf = e_combo2.AddString(str1[i]);
		if((judge_tf == CB_ERR) || (judge_tf == CB_ERRSPACE))
			MessageBox(_T("build baud error!"));
	}
	e_combo2.SetCurSel(5);

这就是2个下拉框的初始化。最后就是MSComm控件,右键添加事件处理程序。

void CsortDlg::OnCommMscomm1()
{
	// TODO: 在此处添加消息处理程序代码
	if(e_mscomm1.get_CommEvent()==2)
	{
		char str[1024]={0};
		long k;
		VARIANT InputData=e_mscomm1.get_Input();
		COleSafeArray fs;
		fs = InputData;
		for(k=0;k<fs.GetOneDimSize();k++)
			fs.GetElement(&k,str+k);

		e_editReceive+=str;
		UpdateData(false);
	}
}

一个基本的串口通信就写好了。

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值