MFC中动态检测串口热插拔的实现

在进行软件应用的时候,有时候需要进行串口的直接插拔而不进行关闭/打开串口的操作,此时,不加任何判断就直接将串口拔掉,此时再接上串口,串口也不能再使用,只有按键关闭串口,再打开,才能重新进行发送接收和正常显示。这就需要进行动态检测的串口热插拔,当检测到设备拔出的时候,关闭串口,当检测到串口插入的时候,再将串口打开,此时就可以正常进行数据的通信和打印输出。

这里主要利用CWndON_WM_DECICECHANGE消息来处理,这个消息需要手动添加,而且只有顶层窗口可以捕捉到,具体步骤:

1、 在消息映射BEGIN_MESSAGE_MAP(Ctbox_debug_viewDlg, CDialogEx)中添加:ON_WM_DEVICECHANGE()

2、 在.h文件中添加函数声明:

afx_msg BOOL OnDeviceChange(UINT nEventTypeDWORD dwData);

3、 实现:移除设备的时候 ,添加设备的时候开启串口、

BOOL CSerialComDlg::OnDeviceChange(UINT nEventType, DWORD dwData)
{
//DEV_BROADCAST_DEVICEINTERFACE* dbd = (DEV_BROADCAST_DEVICEINTERFACE*) dwData;   
switch (nEventType)  
{  
case DBT_DEVICEREMOVECOMPLETE://移除设备,关闭串口
{
CSerialPort::Instance()->close();
}
break;
case DBT_DEVICEARRIVAL://添加设备,打开串口
{
CString szComNo;
int nIndex;
nIndex = m_Com.GetCurSel();
m_Com.GetLBText(nIndex, szComNo);
int nBaud = m_Baud.GetCurSel();
 
if((CSerialPort::Instance())->open(szComNo, nBaud) == FALSE) // 串口打开失败
{
CString sDisp;
sDisp.Format(_T("Cann't open %s,prease try other!"), szComNo);
AfxMessageBox(sDisp, NULL, MB_OK);
}
else  //串口打开成功,初始化串口
{
m_OnOff = TRUE;
}
}
break;  
default:  
break;  
}  
return TRUE; 
}


4、添加头文件:#include  

你可能感兴趣的:(VC++)