【问题标题】:Obtaining the description of a COM device获取 COM 设备的描述信息
【发布时间】:2024-01-12 13:29:01
【问题描述】:

我已经阅读了很多关于 SO 的帖子,但它们都使用 C# 或 MFC。我使用的是普通的 Windows 库,而不是 MFC 共享库或 ATL。

我可以轻松枚举可用的 COM 端口,但我不知道如何获取描述,例如,在 Windows 的设备管理器中看到的描述。我一直在阅读 MSDN,最接近的是 SetupDiGetDeviceRegistryProperty() 但我想必须有一种快速的方法来做到这一点。我还发现 Qt 有 QextSerialEnumerator::getPorts() 但由于我没有使用 Qt,我希望 WinAPI 能提供类似的东西。

如果有人有这样做的sn-p,将不胜感激。

【问题讨论】:

  • 希望对您有所帮助*.com/questions/6642633/…
  • 谢谢,但我没有使用 C# 或任何 .NET。我知道 C# 有一些非常简化且易于使用的静态类用于端口描述和所有其他信息,但我不能使用它,因为我没有使用那种语言。
  • 快速的方法是 SetupDiGetDeviceRegistryProperty(),带有 SPDRP_FRIENDLYNAME 属性。

标签: c++ visual-c++ serial-port


【解决方案1】:

首先,你真正需要什么样的描述?您可以通过 EnumPorts() 和 Registry-way 获得有关 COM 端口的不同信息。例如,registry-way 将显示虚拟 COM 端口 - 这是 EnumPorts 无法做到的。 第二件事 - 有 9 种不同的方式来枚举 COM 端口。它们的使用示例在这里 - http://www.naughter.com/enumser.html (我在我的项目中使用了这里的一些代码)。另外,请注意作者使用了许多特定于 msvc 的特性——用于内存分配等的 atl 容器。

【讨论】:

  • 我已经查看了来自 enumser 的代码,但它确实是 MSVC 特定于 ATL 的,就像你说的那样。我希望它是您在设备管理器中检查任何设备的属性并查看描述时看到的描述。例如,对于我的 arduino,它显示“Arduino UNO”。
  • 我也查看了注册表,但这会显示 //device/bla 而不是设备的描述。
  • 这里使用 ATL 容器,一般来说,仅用于内存分配。我已经成功地将它们替换为“新”,因为我真的不喜欢使用 ATL。
  • 和registry-way可以获取注册表项的全部信息,你可以在regedit中看到。我真的不知道如何获得一个 arduino 名称,但我确切地知道在方法的枚举器输出中简化为 COM ID。如果你稍微修改一下枚举器,你就会得到你想要的。
  • 我从注册表中获得了名称,但这不是设备管理器中的名称。我一直在研究 enumser 一段时间,但它确实依赖于 MFC 类。
【解决方案2】:

我只能说,如果您不知道自己在做什么,请不要使用 setupDI WDM 功能,这对我来说是一种回归,但请检查 windows DDK 示例,我认为您在设备管理器中看到的 dll 实现在 /ports...

问题是串行端口非常古老,因此它们已经被拖了很久,并被一起入侵到 Windows 7 中,因此例如,当您更改 COM 端口时,您必须编写才能获胜。 ini,但 win.ini 不存在(我听到你说),这是因为任何“更改”都会反弹回注册表。

无论如何,祝你好运..

【讨论】:

  • 是的,我一直在阅读它,实际上它似乎对此有点问题。但是,对于我想要实现的目标(简化的串行端口通信库),我需要它们的属性。基本上,我正在尝试构建一个包含描述的 com 设备列表,以便用户可以从下拉菜单中选择一个。