如何在C#中编程获取蓝牙设备的Outgoing ComPort(输出串口)
获取蓝牙配对后的传出COM口(C#实现)
嘿,这个需求我之前处理过好几次,在C#里自动获取蓝牙配对后的传出COM口,有两种比较靠谱的方案,我给你详细讲讲:
方法一:通过WMI查询
Windows Management Instrumentation(WMI)里存储了系统硬件的详细信息,包括串口设备。我们可以通过筛选蓝牙相关的串口,并识别标记为“Outgoing”的端口。
步骤:
- 首先在项目中添加
System.Management引用(右键项目→添加→引用→找到System.Management) - 使用以下代码查询:
using System.Management; public static string GetBluetoothOutgoingComPort(string targetDeviceName) { // 遍历所有串口设备 var serialPortSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_SerialPort"); foreach (ManagementObject port in serialPortSearcher.Get()) { string portDescription = port["Description"]?.ToString(); string portName = port["Name"]?.ToString(); // 格式为COMx // 过滤条件:描述包含蓝牙、Outgoing,且匹配目标设备名称(可根据需求调整) if (!string.IsNullOrEmpty(portDescription) && portDescription.Contains("Bluetooth") && portDescription.Contains("Outgoing") && portDescription.Contains(targetDeviceName)) { return portName; } } // 如果没找到返回null return null; }
注意点:
- 不同设备的描述文本可能略有差异,比如有些是
Bluetooth Serial Port (Outgoing),你可以根据实际情况调整判断逻辑 - 不需要管理员权限就能执行WMI查询
方法二:读取Windows注册表
蓝牙设备的串口映射信息会存储在注册表的特定路径下,直接读取这里的数据会更准确,尤其是当WMI描述不标准的时候。
步骤:
- 确定目标蓝牙设备的MAC地址(可以通过蓝牙设置获取,格式如
00:1A:7D:DA:71:13) - 使用以下代码读取注册表:
using Microsoft.Win32; public static string GetBluetoothOutgoingComPortFromRegistry(string deviceMacAddress) { // 将MAC地址转换为注册表要求的格式:去掉冒号并大写,比如001A7DDA7113 string formattedMac = deviceMacAddress.Replace(":", "").ToUpperInvariant(); string registryPath = $"SYSTEM\\CurrentControlSet\\Services\\BTHPORT\\Parameters\\Devices\\{formattedMac}"; // 打开注册表项(需要管理员权限) using (RegistryKey deviceKey = Registry.LocalMachine.OpenSubKey(registryPath)) { if (deviceKey != null) { // 读取传出串口的数值(存储的是整数,比如3对应COM3) object outgoingPortValue = deviceKey.GetValue("SerialPortOut"); if (outgoingPortValue != null && int.TryParse(outgoingPortValue.ToString(), out int portNumber)) { return $"COM{portNumber}"; } } } return null; }
注意点:
- 读取
HKEY_LOCAL_MACHINE下的注册表项需要管理员权限,所以你的程序可能需要以管理员身份运行 - 该路径在Windows 10/11上是稳定的,旧版本系统可能略有不同
额外提示
如果你不知道目标设备的名称或MAC,可以先通过WMI枚举所有蓝牙设备,获取它们的标识信息后再进行筛选:
// 枚举所有蓝牙设备 var bluetoothSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE Name LIKE '%Bluetooth%'"); foreach (ManagementObject device in bluetoothSearcher.Get()) { string deviceName = device["Name"]?.ToString(); string deviceId = device["DeviceID"]?.ToString(); // 这里可以提取MAC地址或其他标识 Console.WriteLine($"设备名称: {deviceName}, 设备ID: {deviceId}"); }
内容的提问来源于stack exchange,提问作者Waleed Naveed
相关产品推荐
相关产品推荐

