2017-07-26 126 views
0

获取COM端口号(串口,例如:COM1,COM2 ,,,) 当点击一个按钮时,我想在UI上显示可用的COM端口列表。首先点击成功获取COM号码,但第二次点击失败。你有什么理由吗?UWP,第二次调用时设备COM端口号为NULL SerialDevice.FromIdAsync

这是测试两次点击的简单代码。

public async Task<bool> test() 
{ 

    Debug.WriteLine("Start"); 

    var aqs = SerialDevice.GetDeviceSelector(); 
    var dis = await DeviceInformation.FindAllAsync(aqs); 
    var port = await SerialDevice.FromIdAsync(dis[0].Id); 
    Debug.WriteLine("COM=" + port?.PortName); 
    var aqs2 = SerialDevice.GetDeviceSelector(); 
    var dis2 = await DeviceInformation.FindAllAsync(aqs2); 
    var port2 = await SerialDevice.FromIdAsync(dis2[0].Id); 
    //port2 will be null 
    Debug.WriteLine("COM=" + port2?.PortName); 

    Debug.WriteLine("end"); 

    return true; 
} 

public MainPage() 
{ 
    this.InitializeComponent(); 
    Task.Run(() => this.test()).Wait(); 
} 

and Package.appxmanifext has this code。

<Capability Name="internetClient" /> 
    <DeviceCapability Name="serialcommunication"> 
     <Device Id="any"> 
      <Function Type="name:serialPort" /> 
     </Device> 
    </DeviceCapability> 
</Capabilities> 

这里是执行结果。

Start 
COM=COM15 
COM= 
end 

This post也指出了同样的问题。我在这里写了评论。但为了得到答案,我将其作为新问题发布。

问:要更改设备时获取COM端口列表和更新列表,应该写什么代码?

回答

0

您有:

var aqs = SerialDevice.GetDeviceSelector(); 
var dis = await DeviceInformation.FindAllAsync(aqs); 
var port = await SerialDevice.FromIdAsync(dis[0].Id); 
Debug.WriteLine("COM=" + port?.PortName); 
var aqs2 = SerialDevice.GetDeviceSelector(); 
var dis2 = await DeviceInformation.FindAllAsync(aqs); 
var port2 = await SerialDevice.FromIdAsync(dis[0].Id); 
Debug.WriteLine("COM="+port2?.PortName); 

我觉得你的意思有:

..... 
var aqs2 = SerialDevice.GetDeviceSelector(); 
var dis2 = await DeviceInformation.FindAllAsync(aqs2); 
var port2 = await SerialDevice.FromIdAsync(dis2[0].Id); 
Debug.WriteLine("COM="+port2?.PortName); 
+0

:)你是对的,呵呵..对不起,我的测试应用程序是错误的......但结果是一样的......我修改了我的上面的代码。 –

0

With this article,我第1次和第2次调用之间增加的Dispose()。 现在,我得到了预期的结果。

我以为“SerialDevice.FromIdAsync”是指开放串行端口。 然后,第二次访问返回null。 然后我试图重新打开之前关闭它...

public async Task<bool> test() 
     { 

      Debug.WriteLine("Start"); 

      var aqs = SerialDevice.GetDeviceSelector(); 
      var dis = await DeviceInformation.FindAllAsync(aqs); 
      var port = await SerialDevice.FromIdAsync(dis[0].Id); 
      Debug.WriteLine("COM=" + port?.PortName); 

      //closing device... 
      port.Dispose(); 
      port = null; 

      var aqs2 = SerialDevice.GetDeviceSelector(); 
      var dis2 = await DeviceInformation.FindAllAsync(aqs2); 
      var port2 = await SerialDevice.FromIdAsync(dis2[0].Id); 
      //port2 will be null 
      Debug.WriteLine("COM="+port2?.PortName); 

      Debug.WriteLine("end"); 

      return true; 
     } 

,这里是结果(我希望)。

Start 
COM=COM15 
COM=COM15 
end 

在UWP应用程序中,没有开放的串行方法。 什么时候打开?是“SerialDevice.FromIdAsync”?

另一个问题

有没有办法知道“COM端口号”,而无需打开设备?没有“SerialDevice.FromIdAsync”的 ? 因为我只想让下拉COM1,COM2,COM3的菜单....

更新1:

我发现了一个good example for UWP + Serial. 我会好好学习吧:)