You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# Windows应用写入蓝牙COM端口时冻结的问题解决问询

Arduino自动检测功能的蓝牙COM端口冻结问题及解决方法

问题背景

我用C# Windows窗体开发Arduino自动检测功能,逻辑是遍历端口名称,分配给SerialPort并写入字符等待响应。该功能在普通电脑上运行正常,但当电脑存在蓝牙分配的COM端口(Standard Serial over Bluetooth link)时,调用SerialPort.Write或WriteLine方法会导致程序完全冻结。手动通过Windows“蓝牙-->更多选项”删除这些端口后程序恢复正常,尝试用Stopwatch限制写入时长也无效,测试代码如下:

Stopwatch timer = new Stopwatch();
timer.Start();
textBox1.Text = "1";
while (timer.Elapsed.TotalSeconds < 2)
{
    serialPort1.Write("q" + "\n"); // ping port
}
timer.Stop();

需求:识别并排除蓝牙端口

我找到了获取所有端口的代码,但不知道如何筛选蓝牙端口:

System.Management.ManagementObjectSearcher Searcher = new
System.Management.ManagementObjectSearcher("Select * from WIN32_SerialPort");
foreach (System.Management.ManagementObject Port in Searcher.Get())
{
    foreach (System.Management.PropertyData Property in Port.Properties)
    {
        Console.WriteLine(Property.Name + " " + (Property.Value == null ? null : Property.Value.ToString()));
    }
}

解决方案

最终找到的有效代码,可筛选出非蓝牙端口:

string[] ports = SerialPort.GetPortNames(); // 获取所有端口名称  
string[] btports = { }; // 存储蓝牙端口的数组  

// 搜索所有串口设备
System.Management.ManagementObjectSearcher searcher = new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_SerialPort");  

// 检查每个端口是否属于蓝牙设备
foreach (System.Management.ManagementObject port in searcher.Get())  
{
    string deviceId = port["PNPDeviceID"].ToString(); // 获取设备PNP ID
    if (deviceId.Contains("BTHENUM")) // 蓝牙设备的PNP ID包含"BTHENUM"标识
    {
        string portName = port["DeviceID"].ToString(); // 获取蓝牙对应的端口名称
        List<string> list = new List<string>(btports.ToList());
        list.Add(portName);
        btports = list.ToArray(); // 更新蓝牙端口数组
    }
}  

string[] coms = ports.Except(btports).ToArray(); // 从所有端口中排除蓝牙端口
// 现在coms数组仅包含非蓝牙关联的端口

内容的提问来源于stack exchange,提问作者Tsoll

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 15:48:30