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
相关产品推荐
相关产品推荐

