MScomm

关于mfc实现串口通信学习过程

1.总体分析

  • 如何打开串口
  • 如何枚举可用串口
  • mfc的基本对话框的设计
  • 相关控件关联的函数

1.打开串口需要使用achive插件“Microsoft communication control",事先预习好mscomm控件的用法和函数的相关说明。


void CserialDlg::OnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	
		if(m_Comm1.get_PortOpen())
			m_Comm1.put_PortOpen(FALSE);
		m_Comm1.put_CommPort(com);
		m_Comm1.put_InBufferSize(1024);
		m_Comm1.put_OutBufferSize(1024);
		m_Comm1.put_Settings(_T("9600,n,8,1"));
		m_Comm1.put_InputMode(1);
		m_Comm1.put_RThreshold(1);
		m_Comm1.put_InputLen(0);
		if(!m_Comm1.get_PortOpen())
			m_Comm1.put_PortOpen(TRUE);
		else
			MessageBox(_T("cannot open serial port"),_T("提示"));
		m_Comm1.get_Input();
		UpdateData(false);
}

注意:vc++中mscomm的方法名和vs2010中的不同。

2.通过注册表枚举出电脑里可用的串口号。


BOOL CserialDlg::GetSystemSerialComport() //获取计算机中的所有串口
{
	HKEY hKey=NULL;
	CArray<CString,CString> comarray;
	comarray.RemoveAll();
	if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"),0,KEY_READ,&hKey)!=ERROR_SUCCESS)
	{
		return FALSE;
	}
	CString valuename=_T("");
	CString databuffer=_T("");
	DWORD valuenamebufferlength=200;
	DWORD valuetype=0;
	DWORD databuddersize=200;
	int i=0;
	while(RegEnumValue(hKey,i++,valuename.GetBuffer(200),&valuenamebufferlength,NULL,&valuetype,(BYTE*)databuffer.GetBuffer(200),&databuddersize)!= ERROR_NO_MORE_ITEMS)
	{
		comarray.Add(CString(databuffer));
		databuddersize=200;
		valuenamebufferlength=200;
	}
	if(comarray.GetSize()==0)
	{
		MessageBox(_T("本计算机中没有可用的串口"),_T("提示"));
		return FALSE;
	}
	for(int i=0;i<comarray.GetSize();i++)
	{
		((CComboBox *)GetDlgItem(IDC_COMBO1))->InsertString(i,comarray[i]);
	}
	((CComboBox *)GetDlgItem(IDC_COMBO1))->SetCurSel(0);//默认选择第一个串口
	RegCloseKey(hKey);
	return TRUE;
} 

注意:该函数里的如何操作注册表进行枚举串口的过程自行百度了解(RegEnumValue()和RegOpenKeyEx())

3.有关其他插件的消息函数比较简单就不列出

注意:

*在combox的消息处理函数中要注意变量的类型,以及传递的过程中的类型的转换
*设置全局变量进行传递串口号
*枚举产生的类型是CString

效果图:

avatar

文章表达不全,多多指正

猜你喜欢

转载自blog.csdn.net/xuexilangren1/article/details/83793920
今日推荐