2017-07-26 119 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. 我會好好學習吧:)