VS 2015MFC 创建串口上位机

本文档详细介绍了如何使用MFC创建一个串口通讯程序,包括添加控件、处理串口事件、选择串口号、打开和关闭串口等步骤。在X86配置下运行正常,但在X64配置下可能出现错误。程序能够自动检测可用串口,并提供用户选择。通过OnComm事件处理接收数据,并更新到编辑框中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于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程序可以自己修改该为手动选择模式。

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

VS2017 MFC 是一款常用的软件开发工具,可以用来编写串口上位机程序。串口上位机是一种用于与嵌入式设备(如单片机、传感器等)进行通信的软件程序。 首先,我们需要创建一个新的MFC应用程序项目。在项目创建向导中,选择“对话框应用程序”作为项目类型,并选择适当的应用程序选项。 接下来,在对话框资源编辑器中,我们可以添加需要的控件,如按钮、文本框、列表框等。这些控件可以用来展示收到的串口数据、发送数据给设备、控制设备的开关等。 然后,我们需要添加串口通信的相关代码。首先,我们需要打开串口,并设置相关的串口参数,如波特率、数据位、校验位等。然后,我们可以使用串口的读取和写入函数,来实现与设备的数据交换。 在对话框类的成员函数中,我们可以编写相应的事件处理函数,比如当用户点击按钮时,发送指定的数据给设备。我们还可以编写串口数据接收的回调函数,用于处理从设备接收到的数据。 最后,我们可以在建立好的对话框界面中,测试编写的串口上位机程序。我们可以通过按钮来发送数据给设备,并通过文本框或列表框来显示从设备接收到的数据。 总结来说,用VS2017 MFC编写串口上位机可以通过创建应用程序项目、添加控件、编写串口通信代码和事件处理函数等步骤来实现。最终的目的是建立一个用户友好的界面,用于与嵌入式设备进行数据通信和控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值