一、检测window中存在的串口
一台电脑至多存在255个串口,依次检查串口是否存在,如果能打开某一个串口,或打开串口不成功但返回的是ERROR_ACCESS_DENIED错误信息都认为存在存在只是后者表明串口已经被占用
核心代码:
HANDLE hPort = ::CreateFile(sPort,GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
if(hPort == INVALID_HANDLE_VALUE)
{
DWORDdwError = GetLastError();
if(dwError == ERROR_ACCESS_DENIED)
{
//表明串口已经占用
}
}
else
{
//串口存在
CloseHandle(hPort);
}
二、串口热拔插时检测串口
利用Cwnd的ON_WM_DEVICECHANGE消息来处理(vs2010手动添加)
1在消息映射BEGIN_MESSAGE_MAP(Ctbox_debug_viewDlg,CDialogEx)中添加:ON_WM_DEVICECHANGE()
2在头文件类的定义中添加函数声明:afx_msgBOOL OnDeviceChange(UINT nEventType, DWORD dwData);
3实现函数
#include <Dbt.h>
BOOLCtbox_debug_viewDlg::OnDeviceChange(UINT nEventType,DWORD dwData)
{
//DEV_BROADCAST_DEVICEINTERFACE* dbd = (DEV_BROADCAST_DEVICEINTERFACE*)dwData;
switch (nEventType)
{
case DBT_DEVICEREMOVECOMPLETE://移除设备
case DBT_DEVICEARRIVAL://添加设备
RefreshCom();//刷新组合框的内容
break;
default:
break;
}
return TRUE;
}
其中
voidCtbox_debug_viewDlg::RefreshCom(void)
{
int count =m_CombolPort.GetCount();
for(int i=0;i<count;i++)
{
m_CombolPort.DeleteString(count -1 -i);
}
AddCom();
m_CombolPort.SetCurSel(0);
}