0

我有一个需要连接的蓝牙串行设备。我可以通过使用查询 WMI 数据库以找到我需要的蓝牙端口

Get-WmiObject -query "select DeviceID,PNPDeviceID from Win32_SerialPort"

或通过检查使用注册表

HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM\Device\BthModem0

但是我找不到允许我确定两个创建的虚拟 COM 端口中的哪个是传入和传出的公开 API。

如果您在设备管理器中深入挖掘,此信息将由 Windows 显示,因此我应该可用(通过 PInvoke 或其他方式?)但我需要找到一种从 WPF 应用程序以编程方式找到它的方法。

4

1 回答 1

0

您正在寻找的是获得设备功能。

注意区别:传入端口是 传入与传出端口功能

我根据以下示例创建了一个示例 C++ 示例,它可以满足您的需要。您将需要使用 PINVOKE 来调用适当的方法。很抱歉,我无法为我的工作提供 C# 代码。

这取决于 Microsoft 蓝牙堆栈。您需要对 widcomm 或 Toshiba 蓝牙堆栈进行一些修改。

您可以从Github获取示例

要使其正常工作,您需要将以下内容添加到链接器选项中

Setupapi.lib Ole32.lib

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <setupapi.h>
#include <devguid.h>
#include <regstr.h>
#include "Objbase.h"

int main(int argc, char *argv[], char *envp[])
{
    HDEVINFO hDevInfo;
    SP_DEVINFO_DATA DeviceInfoData;
    DWORD i;
    CLSID guid;
    //Class = Ports
    //ClassGuid = { 4d36e978 - e325 - 11ce - bfc1 - 08002be10318}


    LPCOLESTR  guidString = L"{86E0D1E0-8089-11D0-9CE4-08003E301F73}";
    HRESULT a = CLSIDFromString(guidString, &guid);
    // Create a HDEVINFO with all present devices.
    hDevInfo = SetupDiGetClassDevs(&guid,
        0, // Enumerator
        0,
        DIGCF_DEVICEINTERFACE);

    if (hDevInfo == INVALID_HANDLE_VALUE)
    {
        // Insert error handling here.
        return 1;
    }

    // Enumerate through all devices in Set.

    DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
    for (i = 0;SetupDiEnumDeviceInfo(hDevInfo, i,
        &DeviceInfoData);i++)
    {
        DWORD DataT;
        LPTSTR buffer = (LPTSTR)LocalAlloc(LPTR, 4096 * 2);
        DWORD buffersize = 4096;

        LPBYTE buffer2 = (LPBYTE)LocalAlloc(LPTR, 4096 * 2);



        SetupDiGetDeviceRegistryProperty(
            hDevInfo,
            &DeviceInfoData,
            SPDRP_FRIENDLYNAME,
            &DataT,
            (PBYTE)buffer,
            buffersize,
            &buffersize);





        if (wcsstr(buffer, L"Standard Serial over Bluetooth link"))
        {
            SetupDiGetDeviceRegistryProperty(
                hDevInfo,
                &DeviceInfoData,
                SPDRP_CAPABILITIES,
                &DataT,
                (PBYTE)buffer2,
                buffersize,
                &buffersize);

            wprintf(L"Result:%s - ", buffer);
            int a = *buffer2;
            if (a == 0xC0)
            {
                wprintf(L"Incoming");
            }
            else if (a == 0xC4)
            {
                wprintf(L"Outgoing");
            }

            wprintf(L"\n", buffer);

        }

        if (buffer) LocalFree(buffer);
    }


    if (GetLastError() != NO_ERROR &&
        GetLastError() != ERROR_NO_MORE_ITEMS)
    {
        // Insert error handling here.
        return 1;
    }

    //  Cleanup
    SetupDiDestroyDeviceInfoList(hDevInfo);
    getchar();
    return 0;
}

结果

于 2015-09-11T18:35:08.150 回答