枚举所有串口,并自动识别硬件变动

实现枚举全部com port,和自动根据硬件变动更新com port
代码已上传CSDN : http://download.csdn.net/detail/xuleisdjn/9521866
枚举com port 通过读注册表实现。
根据硬件更新com port通过响应系统消息WM_DEVICECHANGE 实现。

注:在对话框的messages里面,我并没有找到这个消息,需要自己手动添加。

下面列出实现方法。

在界面上添加一个CComboBox控件,并为其添加一个控制变量m_combobox;

在头文件中添加

public:
    CComboBox m_combobox;
    afx_msg BOOL OnDeviceChange(UINT nEventType,DWORD_PTR dwData);
    void FindComPort();

在cpp的message map中添加

BEGIN_MESSAGE_MAP(CcomportDlg, CDialogEx)
    ON_WM_DEVICECHANGE()
END_MESSAGE_MAP()

在cpp的DoDataExchange中添加

void CcomportDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_COMBO1, m_combobox);
}

在cpp中添加两个函数

BOOL CcomportDlg::OnDeviceChange(UINT nEventType, DWORD_PTR dwData)  
{  
    if(nEventType==DBT_DEVNODES_CHANGED)  
        FindComPort();  

    return  TRUE;  
}  

注:其中宏定义 DBT_DEVNODES_CHANGED 需要添加头文件 Dbt.h

void CcomportDlg::FindComPort()  
{  
    HKEY   hKey;  
    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Hardware\\DeviceMap\\SerialComm"), NULL, KEY_READ, &hKey)==ERROR_SUCCESS)  
    {  
        TCHAR       szPortName[256], szComName[256];  
        DWORD       dwLong, dwSize;  
        int         nCount  = 0;  

        m_combobox.ResetContent();  
        while(true)  
        {  
            dwLong  = dwSize    = 256;  
            if(RegEnumValue(hKey, nCount, szPortName, &dwLong, NULL, NULL, (PUCHAR)szComName, &dwSize)==ERROR_NO_MORE_ITEMS)  
                break;  

            m_combobox.InsertString(nCount, szComName);  
            nCount++;  
        }  
        RegCloseKey(hKey);  
        m_combobox.SetCurSel(0);  
    }  
}
#include <Dbt.h>

在cpp的OnInitDialog 中添加FindcomPort();

    // TODO: Add extra initialization here
    FindComPort();

经过vs2010的编译在win7系统下运行正常,可以自动获取电脑的所有com 口,当有硬件变动的时候(我用的测试终端,usb接口,会识别通信com口),会自动刷新com 口列表。

代码已上传CSDN : http://download.csdn.net/detail/xuleisdjn/9521866

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值