Windows IoT树莓派中USB转串口适配器PortName为空问题求助
解决Windows IoT树莓派上SerialDevice PortName为空的问题
我之前在开发Windows IoT树莓派项目时,也碰到过完全一样的问题——明明能正常实例化SerialDevice并收发数据,但它的PortName属性就是空字符串,没法区分是COM1还是COM2,多适配器场景下确实头疼!
问题原因
其实SerialDevice的PortName属性在部分USB转串口适配器的驱动或Windows IoT版本中不会被正确填充,但我们可以从查询到的DeviceInformation对象的属性字典里拿到真实的端口名称。
解决方案步骤
- 调用
DeviceInformation.FindAllAsync(SerialDevice.GetDeviceSelector())获取设备信息集合后,不要直接实例化SerialDevice就完事,先从每个DeviceInformation的Properties中提取端口名 - 关键属性键是
System.Devices.SerialPortName,这个属性里存储的就是真实的COM口名称
代码示例
using Windows.Devices.Enumeration; using Windows.Devices.SerialCommunication; using System.Diagnostics; // 查询所有可用串口设备 var deviceInfos = await DeviceInformation.FindAllAsync(SerialDevice.GetDeviceSelector()); foreach (var deviceInfo in deviceInfos) { // 尝试从设备属性中提取串口名称 if (deviceInfo.Properties.TryGetValue("System.Devices.SerialPortName", out object portNameValue)) { string actualPortName = portNameValue.ToString(); Debug.WriteLine($"识别到串口: {actualPortName}"); // 实例化SerialDevice并关联端口名 SerialDevice serialDevice = await SerialDevice.FromIdAsync(deviceInfo.Id); if (serialDevice != null) { // 这里可以把actualPortName和serialDevice关联起来,方便后续区分 // 比如存入字典:serialDevices[actualPortName] = serialDevice; // ... 执行你的串口收发逻辑 } } }
额外提示
如果需要更精准的多设备区分,除了端口名,还可以结合DeviceInformation.Id(设备唯一路径)或者System.Devices.HardwareIds属性(硬件ID),即使是同型号的适配器,这些属性也能帮你做唯一识别。
内容的提问来源于stack exchange,提问作者RCleveland
相关产品推荐
相关产品推荐

