65.9K
CodeProject 正在变化。 阅读更多。
Home

Windows Mobile 上的串行端口枚举

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.88/5 (11投票s)

2007 年 11 月 29 日

CPOL

1分钟阅读

viewsIcon

122395

downloadIcon

45303

如何在 Windows Mobile 设备上枚举串口(包括由 Microsoft Bluetooth 堆栈创建的虚拟端口)。

Screenshot - WMEnumComPorts.png

引言

本文简要介绍了一种用于 Windows Mobile 设备的串口枚举方法,该方法包括 Microsoft Bluetooth 堆栈的虚拟 COM 端口。

背景

我最近被要求编写一个小型的用户界面,用于枚举 Windows Mobile 设备上的所有 COM 端口,并在可能的情况下提供有关连接设备的简短描述。 在 CodeProject 上查找解决方案后,我在 Joaquín 的 文章 中找到了一种非常有希望的方法。 我通过枚举 HKEY_LOCAL_MACHINE\Drivers\Active 下的所有键,采用了类似的方法,但发现了一个大问题:在安装了 Microsoft Bluetooth 堆栈的设备上,虚拟 COM 端口未在此键下列出。 有趣的是,Widcomm Bluetooth 堆栈似乎可以正确处理这个问题。

上图显示了运行示例应用程序的两个 Windows Mobile 设备。 在右侧,您可以看到带有 Widcomm Bluetooth 堆栈的 WM6 Asus P535 的屏幕截图。 所有枚举的端口都来自我上面提到的活动驱动程序注册表键。 在左侧,您可以看到带有 Microsoft Bluetooth 堆栈的 WM5 i-mate K-Jam 设备。 为了检索有关 COM6: 端口的信息,我不得不查看注册表中的其他位置,即 Software\Microsoft\Bluetooth\Serial\Ports 键下。

使用代码

使用串口枚举代码非常简单。 首先声明一个 CSerialPortEnum 类型的对象

CSerialPortEnum portEnum;

现在,我们准备好枚举串口了

size_t i;
int    iItem = 0;

for(i = 0; i < portEnum.GetCount(); ++i)
{
    const CSerialPortInfo *pInfo = portEnum[i];

    if(pInfo != NULL)
    {
        iItem = listPort.AddItem(iItem, 0, pInfo->GetPortName());
        listPort.SetItemText(iItem, 1, pInfo->GetDescription());
    }
}

请注意,枚举对象不会按 COM 端口号对列表进行排序。 如果您需要重用该对象再次枚举串口,只需调用 EnumeratePorts 函数即可。

另请注意,此代码仅在 Windows Mobile 5 和 6 设备(Pocket PC)上进行了测试。

历史

  • 2007-11-29 - CodeProject 首次发布。
© . All rights reserved.