VS 2015MFC 创建串口上位机

关于MFC 创建一个新的串口上位机通讯程序:
1.
百度里面输入搜索一个像在这里插入图片描述
这样的一个控件,
2.MFC编译中找到选择工具项
COM组件添加控件在工具箱内拖动在窗口内使用;
在这里插入图片描述
注意:我使用的编译配置管理器时X86,切换到X64就会报错,
在这里插入图片描述
3.创建一个新的MFC应用程序;
在这里插入图片描述
添加如上图中功能控件,给OnCommMscomm1(像电话的这个控件)右击添加事件处理程序

void C串口通讯Dlg::OnCommMscomm1()
{
	// TODO: 在此处添加消息处理程序代码
	if (m_mscom.get_CommEvent() == 2)	//事件值为2表示接收缓冲区内有字符
	{
		char str[1024] = { 0 };
		long k;
		VARIANT InputData = m_mscom.get_Input();	//读缓冲区
		COleSafeArray fs;
		fs = InputData;	//VARIANT型变量转换为COleSafeArray型变量
		for (k = 0; k<fs.GetOneDimSize(); k++)
			fs.GetElement(&k, str + k);	//转换为BYTE型数组

		m_EditReveive += str;      //	接收到编辑框里面
								   //SetTimer(1,10,NULL);		//延时10ms
		
	
		UpdateData(false); //更新到控件
	}
}

4.添加串口号:

void C串口通讯Dlg::GetCom()
{
	//程序启动时获取全部可用串口
	HANDLE hCom;
	int i, k;
	CString str;
	BOOL flag;

	((CComboBox *)GetDlgItem(IDC_COMBO1))->ResetContent();
	flag = FALSE;
	 num = 0;
	for (i = 1; i <= 16; i++)
	{//此程序支持16个串口
		str.Format(L"\\\\.\\COM%d", i);
		hCom = CreateFile(str, 0, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
		if (INVALID_HANDLE_VALUE != hCom)
		{//能打开该串口,则添加该串口
			CloseHandle(hCom);
			str = str.Mid(4);
			((CComboBox *)GetDlgItem(IDC_COMBO1))->AddString(str);
			if (flag == FALSE)
			{
				flag = TRUE;
				num = i;
			}
		}
	}
	i = ((CComboBox *)GetDlgItem(IDC_COMBO1))->GetCount();
	if (i == 0)
	{//若找不到可用串口则禁用“打开串口”功能
		((CComboBox *)GetDlgItem(IDC_COMBO1))->EnableWindow(FALSE);

	}
	else
	{
		k = ((CComboBox *)GetDlgItem((IDC_COMBO1)))->GetCount();
		((CComboBox *)GetDlgItem(IDC_COMBO1))->SetCurSel(k - 1);
		//mCom.BindCommPort(num);
	}
}

5.添加按钮程序:

void C串口通讯Dlg::OnBnClickedButton1()//打开串口按钮
{
	// TODO: 在此添加控件通知处理程序代码
	CString str, n;					//定义字符串
	GetDlgItemText(IDC_BUTTON1, str);  //获取给定控件的文本
	CWnd *h1;
	h1 = GetDlgItem(IDC_BUTTON1);		//指向控件的caption

	if (!m_mscom.get_PortOpen())
	{
		try
		{
			m_mscom.put_CommPort(num);	//选择串口
		}
		catch (CException* e)
		{
			m_mscom.put_OutBufferCount(0);

			AfxMessageBox(L"打开串口 失败");
			return;
		}
		m_mscom.put_InputMode(1);			//设置输入方式为二进制方式
		m_mscom.put_Settings(_T("9600,n,8,1"));		//设置串口参数,波特率,无奇偶校验,位停止位,位数据位
		m_mscom.put_InputLen(1024);		//设置当前接收区数据长度为1024
		m_mscom.put_RThreshold(1);			//接收缓冲区有1个及1个以上字符时,触发OnComm事件
		m_mscom.put_RTSEnable(1);			//设置RT允许


		m_mscom.put_PortOpen(true);		//打开串口

		if (m_mscom.get_PortOpen())
		{
			str = _T("关闭串口");
			UpdateData(true);
			h1->SetWindowText(str);			//改变按钮名称为‘’关闭串口”
		}
	}
	else
	{
		m_mscom.put_PortOpen(false);		//关闭串口
		if (str != _T("打开串口"))
		{
			str = _T("打开串口");
			UpdateData(true);				//将控件的状态传给其关联的变量
			h1->SetWindowText(str);			//改变按钮名称为打开串口
		}
	}

}

6。添加初始化程序;

// TODO: 在此添加额外的初始化代码
	//m_Combo.AddString(_T("COM1"));
	//m_Combo.AddString(_T("COM2"));
	//m_Combo.AddString(_T("COM3"));
	//m_Combo.AddString(_T("COM4"));
	//m_Combo.AddString(_T("COM5"));
	//m_Combo.AddString(_T("COM6"));
	//m_Combo.AddString(_T("COM7"));
	//m_Combo.AddString(_T("COM8"));
	//m_Combo.AddString(_T("COM9"));
	//m_Combo.SetCurSel(0);//初始时下拉列表为COM1

	//程序启动时获取全部可用串口
	HANDLE hCom;
	int i, k;
	CString str;
	BOOL flag;

	((CComboBox *)GetDlgItem(IDC_COMBO1))->ResetContent();
	flag = FALSE;
	 num = 0;
	for (i = 1; i <= 16; i++)
	{//此程序支持16个串口
		str.Format(L"\\\\.\\COM%d", i);
		hCom = CreateFile(str, 0, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
		if (INVALID_HANDLE_VALUE != hCom)
		{//能打开该串口,则添加该串口
			CloseHandle(hCom);
			str = str.Mid(4);
			((CComboBox *)GetDlgItem(IDC_COMBO1))->AddString(str);
			if (flag == FALSE)
			{
				flag = TRUE;
				num = i;
			}
		}
	}
	i = ((CComboBox *)GetDlgItem(IDC_COMBO1))->GetCount();
	if (i == 0)
	{//若找不到可用串口则禁用“打开串口”功能
		((CComboBox *)GetDlgItem(IDC_COMBO1))->EnableWindow(FALSE);

	}
	else
	{
		k = ((CComboBox *)GetDlgItem((IDC_COMBO1)))->GetCount();
		((CComboBox *)GetDlgItem(IDC_COMBO1))->SetCurSel(k - 1);
		//mCom.BindCommPort(num);
	}

读取COM程序可以自己修改该为手动选择模式。

程序功能实现:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值