串口热插拔的实现

      

             根据网上资料实现的串口热插拔,记录下来


            首先手动添加ON_WM_DEVICECHANGE()到

            BEGIN_MESSAGE_MAP(CxxxxxDlg, CDialogEx)

           ON_WM_SYSCOMMAND()

            END_MESSAGE_MAP()

            注意千万不要添加到

             BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
             ON_WM_TIMER()
             END_MESSAGE_MAP()

             在头文件里面添加消息响应函数

             afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD_PTR dwData);

            

             定义消息响应函数

            

BOOL CxxxxxDlg::OnDeviceChange(UINT nEventType, DWORD_PTR dwData)
{
	//DEV_BROADCAST_DEVICEINTERFACE* dbd = (DEV_BROADCAST_DEVICEINTERFACE*) dwData;
	switch (nEventType)
	{
 	case DBT_DEVICEARRIVAL:
	{
		CUIntArray portse, portsu;
		EnumerateSerialPorts(ports, portse, portsu);

		unsigned short uicounter;
		unsigned short uisetcom;
		CString str;
		int inseldex = m_ComList.GetCurSel();
		m_ComList.GetLBText(inseldex, m_strPort);
		//获取可用串口个数  
		uicounter = ports.GetSize();
		m_ComList.ResetContent();
		//如果个数大于0  
		if (uicounter > 0)
		{
			//初始化串口列表框  
			for (int i = 0; i < uicounter; i++)
			{
				uisetcom = ports.ElementAt(i);
				str.Format(_T("COM%d "), uisetcom);
				m_ComList.AddString(str);

			}
			m_ComList.SetCurSel(0);
		}
		break;
	}
	case DBT_DEVICEREMOVECOMPLETE:
	{
		CUIntArray portse, portsu;
		EnumerateSerialPorts(ports, portse, portsu);

		unsigned short uicounter;
		unsigned short uisetcom;
		CString str;
		int inseldex = m_ComList.GetCurSel();
		m_ComList.GetLBText(inseldex, m_strPort);
		//获取可用串口个数  
		uicounter = ports.GetSize();
		m_ComList.ResetContent();
		//如果个数大于0  
		if (uicounter > 0)
		{
			m_cstrComList.RemoveAll();
			//初始化串口列表框  
			for (int i = 0; i < uicounter; i++)
			{
				uisetcom = ports.ElementAt(i);
				str.Format(_T("COM%d "), uisetcom);
				m_cstrComList.Add(str);
				m_ComList.AddString(str);

			}
			for (int i = 0; i < m_cstrComList.GetSize(); i++)
			{
				str += m_cstrComList.GetAt(i);
			}
			if (str.Find(m_strPort))
			{

				m_strPort += "已被拔出";
				MessageBox(m_strPort);
				m_ComList.SetCurSel(0);
				break;
			}

		}
		else
		{
			m_ComList.SetCurSel(0);
			AfxMessageBox(_T("串口已被拔出"));
			break;
		}
		m_ComList.SetCurSel(0);
		break;
	}
		
		
		return TRUE;
	}
	return FALSE;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值