在MFC中用combo来枚举串口,并且实现热插拔。在对话框界面中添加ComboBox按键。
给Combo Box控件添加变量
给控件添加变量名为:ComboPortsList.
添加遍历串口并且把串口名添加到ComboPortsList中的函数。AddCom()
添加代码:
//串口最多只能256个,所以判断从零到256
for (int i = 1; i < 256; i++)
{
//判断串口是否存在并且添加到列表中
CString sPort;
sPort.Format(_T("COM%d"), i);
//尝试打开对应的串口
BOOL bSuccess = FALSE;
HANDLE hPort = ::CreateFile(sPort, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
if (hPort == INVALID_HANDLE_VALUE)
{
//如果打开错误判断错误类型
DWORD dwError = GetLastError();
if (dwError == ERROR_ACCESS_DENIED)
{
//如果错误类型为拒绝访问,这表示该串口存在但已经被占用,也设置标记为true
bSuccess = TRUE;
}
}
else
{
//如果打开成功则标记为true
bSuccess = TRUE:
CloseHandle(hPort);
}
if (bSuccess)
{
//对于标记为true的串口名称添加入列表中
ComboPortsList.AddString(sPort);
}
}
上面的代码实现了所有的串口添加到combobox控件的列表中。
下面我们用OnDeviceChange的消息响应函数来实现串口热插拔后,Combobox列表进行响应的更新。
在dlg.h文件中添加头文件:
#include <dbt.h>
并添加语句声明消息响应函数
public:
afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD_PTR dwData);
在dlg.cpp文件中添加
BEGIN_MESSAGE_MAP(CMFCControlDlg, CDialogEx)和END_MESSAGE_MAP()中添加消息ON_WM_DEVICECHANGE()
添加对应的响应函数:OnDeviceChange(UINT nEventType, DWORD_PTR dwData);
这样就可以实现com的热插拔并且进行更新了。
代码如下:
BOOL CMFCControlDlg::OnDeviceChange(UINT nEventType, DWORD_PTR dwData)
{
switch (nEventType)
{
case DBT_DEVICEREMOVECOMPLETE://移除设备
case DBT_DEVICEARRIVAL://添加设备
RefreshCom();//刷新组合框的内容
break;
default:
break;
}
return TRUE;
}
void CMFCControlDlg::RefreshCom()
{
// TODO: 在此处添加实现代码.
int i = ComboPortsList.SelectString(0, strPort);
if (i > -1)
return;
int count = ComboPortsList.GetCount();
for(int i=0;i<count;i++)
{
ComboPortsList.DeleteString(count -1 -i);
}
AddCom();
ComboPortsList.SetCurSel(0);
/**/
}