【问题标题】:How come GetDefaultCommConfig() Doesn't Work with Bluetooth SPP Devices?为什么 GetDefaultCommConfig() 不适用于蓝牙 SPP 设备?
【发布时间】:2011-07-27 20:42:28
【问题描述】:

我维护了一个应用程序,该应用程序向用户提供主机上可用串行端口设备的列表。此应用程序使用 GetDefaultCommConfig() 函数来验证其串行端口名称列表中的设备是否有效。我收到通知说我的应用程序不适用于蓝牙串行端口。今天调试这个问题的时候,发现用蓝牙串口名调用GetDefaultCommConfig()函数没有返回成功的值。 GetLastError() 函数在这些情况下返回 29(无效参数)。这个问题有解决办法吗?

【问题讨论】:

  • 它是什么蓝牙堆栈?微软自己的还是 Widcomm/Broadcom、BlueSoleil 还是东芝?还是全部? :-,(
  • 这是 Microsoft 堆栈,我正在使用串行通信 API。
  • 是的,我在这里也看到了这种行为。 (例如,该 API 可以使用 Widcomm 端口)。例如,我使用 WMI 或查看注册表以获取端口名称,例如32feet.codeplex.com/…
  • 我使用注册表来获取端口名称列表,但该方法可能会导致当前无法使用的端口名称(例如已拔出的 USB 串行端口)。我使用 GetDefaultCommConfig() 来忽略任何看似无效的名称。对于蓝牙映射的串行端口,此功能似乎总是失败。
  • 我想可以查看 HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM,如果名称是 \Device\BtModemNNN 那么它是 MSFT 蓝牙堆栈,不要使用 GetDefaultCommConfig() ...

标签: winapi bluetooth serial-port


【解决方案1】:

我通过蓝牙查看了我机器上的串行端口,并且可以确认 GetDefaultCommConfig() 对于 Microsoft 蓝牙堆栈创建的虚拟串行端口失败。然而,它似乎对 Widcomm 端口工作正常。 (我还没有测试过 BlueSoleil/Toshiba/等)

看来最好的计划是为 MSFT 端口使用 GetDefaultCommConfig()。要确定哪些端口是哪个堆栈,请检查 HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM 下的值,其中列出了 COM 端口名称作为值。如果值名称是“\Device\BtModemNNN”,那么它就是 MSFT 蓝牙堆栈。 (Widcomm 有“\Device\BtPortNNN”)。

[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM]
"\\Device\\BtPort3"="COM19"
"\\Device\\BthModem2"="COM25"

艾伦

【讨论】:

    【解决方案2】:

    这不是一个完整的答案。 我发现即使使用 MSFT 的堆栈(端口显示 \Device\BthModem0 和 \Device\BthModem1),我的 Windows 7 开发机器也能从蓝牙 SPP COM 端口的 GetDefaultCommConfig() 正确返回。

    但是,我确实看到 GetDefaultCommConfig() 在 Windows 8.1 中失败,返回代码为 87(由 GetLastError() 返回)。这与绝对不存在的 COM 端口的行为相同。

    SPP COM 端口仍然可以与超级终端类型的应用程序一起使用,但我不知道如何在该应用程序中扫描或打开端口 - 我只知道我的应用程序使用 GetDefaultCommConfig() 及其来自 kernel32.dll 的同类程序,并且这不工作。

    远射半,但我认为 4 年后没有其他人有任何意见?

    【讨论】:

      猜你喜欢
      • 2012-04-22
      • 2014-12-02
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      • 2017-12-14
      • 2023-03-21
      • 2020-04-30
      • 1970-01-01
      相关资源
      最近更新 更多