【MFC】程序自动检测可用串口的方法

本文详细介绍了一种在Windows环境下实现串口热插拔检测的方法,包括头文件声明、源文件消息映射及代码实现。文章还提供了两种枚举串口的方法:注册表枚举法和穷举遍历法,并简要说明了如何从所有可用串口中找出发生热插拔的串口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

步骤

1、 头文件添加声明。

protected:
	//实现串口热插拔 
	afx_msg BOOL		OnDeviceChange(UINT nEventType, DWORD dwData);

 

2、源文件添加消息映射。

BEGIN_MESSAGE_MAP(CFixtureConfig, CDialog)
	ON_WM_DEVICECHANGE() 
END_MESSAGE_MAP()

 

3、源文件添加代码实现。

BOOL CFixtureConfig::OnDeviceChange(UINT nEventType, DWORD dwData)  
{  
        switch (nEventType)  
        {
        //串口被移除  
        case DBT_DEVICEREMOVECOMPLETE:  
        //串口插入或者变为有效
        case DBT_DEVICEARRIVAL:  
                EnumSerialPort(m_saTmpCom);
                break;  

        default:  
                break;  
        }  
   
        return TRUE;  
} 

 

4、枚举串口。

a、注册表枚举法。

BOOL CFixtureConfig::EnumSerialPort(CStringArray &saCom)  
{  
        HKEY				hKey;  
        DWORD				dwIndex;
        LONG				lResult;
        DWORD				dwType;  
        DWORD				dwKeyNameLen;  
        CHAR				szKeyName[256];  
        DWORD				dwKeyDataLen;  
        UCHAR				szKeyData[80];  
        CString				strCom, str;
        LPCTSTR				lpSubKey;

        saCom.RemoveAll();
  
        lpSubKey = _T("HARDWARE\\DEVICEMAP\\SERIALCOMM\\");  
    
        lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpSubKey, 0, KEY_READ, &hKey);  
    
        if (lResult != ERROR_SUCCESS)  
        {  
                str.Format(_T("[Main] RegOpenKeyEx()函数打开失败!"));
                AfxMessageBox(str);  
                return FALSE;  
        }  
  
        dwIndex = 0;

        while(1)  
        {  
                memset(szKeyName, 0x0, sizeof(szKeyName));
                memset(szKeyData, 0x0, sizeof(szKeyData));

                dwKeyNameLen = sizeof(szKeyName);  
                dwKeyDataLen = sizeof(szKeyData); 

                lResult = RegEnumValue(hKey, dwIndex ++, szKeyName, &dwKeyNameLen, NULL, &dwType, szKeyData, &dwKeyDataLen);  
  
                if ((lResult == ERROR_SUCCESS) || (lResult == ERROR_MORE_DATA))  
                {  
                        strCom = (char *)szKeyData;
                        saCom.Add(strCom);
                }  
                else  
                {  
                        break;  
                }  
        }  

        RegCloseKey(hKey);  
  
        return true;  
}  

 

b、穷举遍历法。

具体方法见这篇文章:打开串口号大于9的串口,CreateFile返回失败!

 

5、备注:EnumSerialPort()函数枚举出来的串口为系统所有可用串口的集合。如何从中找出发生热拔插的那个串口,还需要对可用串口队列做动态分选,分选算法这里就不赘述了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值