title: Windows Universal App Serial Ports won't open, SerialDevice.FromIdAsync always null
body: <p>I am trying to use serial ports in a Windows Universal Application. I have been using Microsoft's Serial Sample application as a template however I have hit a rather strange issue.</p>
  
  <pre><code>var dis = await DeviceInformation.FindAllAsync(SerialDevice.GetDeviceSelectorFromUsbVidPid(0x04D8, 0x000A));
  var sp = await SerialDevice.FromIdAsync(dis[0].Id);
  </code></pre>
  
  <p>This is a the snippet that is failing. It is slightly altered from the original sample as it connects to the first device with a specific vendor. Now if I take this snippet and put it in the sample application produced by Microsoft the serial port opens and all is good. However when I move this code into my own project it always returns <code>null</code> from the method. </p>
  
  <p>Here is the full <code>MainPage.xaml.cs</code> from the Microsoft sample with my alerations:
  <strong>This Works!!</strong></p>
  
  <pre><code>// Copyright (c) Microsoft. All rights reserved.
  
  using System;
  using System.Collections.ObjectModel;
  using System.Diagnostics;
  using System.Linq;
  using Windows.UI.Xaml;
  using Windows.UI.Xaml.Controls;
  using Windows.Devices.Enumeration;
  using Windows.Devices.SerialCommunication;
  using Windows.Storage.Streams;
  using System.Threading;
  using System.Threading.Tasks;
  
  namespace SerialSample
  {    
    public sealed partial class MainPage : Page
    {
      /// &lt;summary&gt;
      /// Private variables
      /// &lt;/summary&gt;
      private SerialDevice serialPort = null;
      DataWriter dataWriteObject = null;
      DataReader dataReaderObject = null;
  
      private ObservableCollection&lt;DeviceInformation&gt; listOfDevices;
      private CancellationTokenSource ReadCancellationTokenSource;
  
      public MainPage()
      {
          this.InitializeComponent();            
          comPortInput.IsEnabled = false;
          sendTextButton.IsEnabled = false;
          listOfDevices = new ObservableCollection&lt;DeviceInformation&gt;();
          ListAvailablePorts();
      }
  
      /// &lt;summary&gt;
      /// ListAvailablePorts
      /// - Use SerialDevice.GetDeviceSelector to enumerate all serial devices
      /// - Attaches the DeviceInformation to the ListBox source so that DeviceIds are displayed
      /// &lt;/summary&gt;
      private async void ListAvailablePorts()
      {
          try
          {
              string aqs = SerialDevice.GetDeviceSelector();
              var dis = await DeviceInformation.FindAllAsync(SerialDevice.GetDeviceSelectorFromUsbVidPid(0x04D8, 0x000A));
              serialPort = await SerialDevice.FromIdAsync(dis[0].Id);
  
              status.Text = "Select a device and connect";
  
              for (int i = 0; i &lt; dis.Count; i++)
              {
                  listOfDevices.Add(dis[i]);
              }
  
              DeviceListSource.Source = listOfDevices;
              comPortInput.IsEnabled = true;
              ConnectDevices.SelectedIndex = -1;
  
              try
              {
  
  
                  // Disable the 'Connect' button 
                  comPortInput.IsEnabled = false;
  
                  // Configure serial settings
                  serialPort.WriteTimeout = TimeSpan.FromMilliseconds(1000);
                  serialPort.ReadTimeout = TimeSpan.FromMilliseconds(1000);
                  serialPort.BaudRate = 9600;
                  serialPort.Parity = SerialParity.None;
                  serialPort.StopBits = SerialStopBitCount.One;
                  serialPort.DataBits = 8;
                  serialPort.Handshake = SerialHandshake.None;
  
                  // Display configured settings
                  status.Text = "Serial port configured successfully: ";
                  status.Text += serialPort.BaudRate + "-";
                  status.Text += serialPort.DataBits + "-";
                  status.Text += serialPort.Parity.ToString() + "-";
                  status.Text += serialPort.StopBits;
  
                  // Set the RcvdText field to invoke the TextChanged callback
                  // The callback launches an async Read task to wait for data
                  rcvdText.Text = "Waiting for data...";
  
                  // Create cancellation token object to close I/O operations when closing the device
                  ReadCancellationTokenSource = new CancellationTokenSource();
  
                  // Enable 'WRITE' button to allow sending data
                  sendTextButton.IsEnabled = true;
  
                  Listen();
              }
              catch (Exception ex)
              {
                  status.Text = ex.Message;
                  comPortInput.IsEnabled = true;
                  sendTextButton.IsEnabled = false;
              }
          }
          catch (Exception ex)
          {
              status.Text = ex.Message;
          }
      }
  
      /// &lt;summary&gt;
      /// comPortInput_Click: Action to take when 'Connect' button is clicked
      /// - Get the selected device index and use Id to create the SerialDevice object
      /// - Configure default settings for the serial port
      /// - Create the ReadCancellationTokenSource token
      /// - Start listening on the serial port input
      /// &lt;/summary&gt;
      /// &lt;param name="sender"&gt;&lt;/param&gt;
      /// &lt;param name="e"&gt;&lt;/param&gt;
      private async void comPortInput_Click(object sender, RoutedEventArgs e)
      {
          var selection = ConnectDevices.SelectedItems;
  
          if (selection.Count &lt;= 0)
          {
              status.Text = "Select a device and connect";
              return;
          }
  
          DeviceInformation entry = (DeviceInformation)selection[0];         
  
          try
          {                
              serialPort = await SerialDevice.FromIdAsync(entry.Id);
  
              // Disable the 'Connect' button 
              comPortInput.IsEnabled = false;
  
              // Configure serial settings
              serialPort.WriteTimeout = TimeSpan.FromMilliseconds(1000);
              serialPort.ReadTimeout = TimeSpan.FromMilliseconds(1000);                
              serialPort.BaudRate = 9600;
              serialPort.Parity = SerialParity.None;
              serialPort.StopBits = SerialStopBitCount.One;
              serialPort.DataBits = 8;
              serialPort.Handshake = SerialHandshake.None;
  
              // Display configured settings
              status.Text = "Serial port configured successfully: ";
              status.Text += serialPort.BaudRate + "-";
              status.Text += serialPort.DataBits + "-";
              status.Text += serialPort.Parity.ToString() + "-";
              status.Text += serialPort.StopBits;
  
              // Set the RcvdText field to invoke the TextChanged callback
              // The callback launches an async Read task to wait for data
              rcvdText.Text = "Waiting for data...";
  
              // Create cancellation token object to close I/O operations when closing the device
              ReadCancellationTokenSource = new CancellationTokenSource();
  
              // Enable 'WRITE' button to allow sending data
              sendTextButton.IsEnabled = true;
  
              Listen();
          }
          catch (Exception ex)
          {
              status.Text = ex.Message;
              comPortInput.IsEnabled = true;
              sendTextButton.IsEnabled = false;
          }
      }
  
      /// &lt;summary&gt;
      /// sendTextButton_Click: Action to take when 'WRITE' button is clicked
      /// - Create a DataWriter object with the OutputStream of the SerialDevice
      /// - Create an async task that performs the write operation
      /// &lt;/summary&gt;
      /// &lt;param name="sender"&gt;&lt;/param&gt;
      /// &lt;param name="e"&gt;&lt;/param&gt;
      private async void sendTextButton_Click(object sender, RoutedEventArgs e)
      {
          try
          {                
              if (serialPort != null)
              {
                  // Create the DataWriter object and attach to OutputStream
                  dataWriteObject = new DataWriter(serialPort.OutputStream);
  
                  //Launch the WriteAsync task to perform the write
                  await WriteAsync();
              }
              else
              {
                  status.Text = "Select a device and connect";                
              }
          }
          catch (Exception ex)
          {
              status.Text = "sendTextButton_Click: " + ex.Message;
          }
          finally
          {
              // Cleanup once complete
              if (dataWriteObject != null)
              {
                  dataWriteObject.DetachStream();
                  dataWriteObject = null;
              }
          }
      }
  
      /// &lt;summary&gt;
      /// WriteAsync: Task that asynchronously writes data from the input text box 'sendText' to the OutputStream 
      /// &lt;/summary&gt;
      /// &lt;returns&gt;&lt;/returns&gt;
      private async Task WriteAsync()
      {
          Task&lt;UInt32&gt; storeAsyncTask;
  
          if (sendText.Text.Length != 0)
          {
              // Load the text from the sendText input text box to the dataWriter object
              dataWriteObject.WriteString(sendText.Text);                
  
              // Launch an async task to complete the write operation
              storeAsyncTask = dataWriteObject.StoreAsync().AsTask();
  
              UInt32 bytesWritten = await storeAsyncTask;
              if (bytesWritten &gt; 0)
              {                    
                  status.Text = sendText.Text + ", ";
                  status.Text += "bytes written successfully!";
              }
              sendText.Text = "";
          }
          else
          {
              status.Text = "Enter the text you want to write and then click on 'WRITE'";
          }
      }
  
      /// &lt;summary&gt;
      /// - Create a DataReader object
      /// - Create an async task to read from the SerialDevice InputStream
      /// &lt;/summary&gt;
      /// &lt;param name="sender"&gt;&lt;/param&gt;
      /// &lt;param name="e"&gt;&lt;/param&gt;
      private async void Listen()
      {
          try
          {
              if (serialPort != null)
              {
                  dataReaderObject = new DataReader(serialPort.InputStream);
  
                  // keep reading the serial input
                  while (true)
                  {
                      await ReadAsync(ReadCancellationTokenSource.Token);
                  }
              }
          }
          catch (Exception ex)
          {
              if (ex.GetType().Name == "TaskCanceledException")
              {
                  status.Text = "Reading task was cancelled, closing device and cleaning up";
                  CloseDevice();
              }
              else
              {
                  status.Text = ex.Message;
              }
          }
          finally
          {
              // Cleanup once complete
              if (dataReaderObject != null)
              {
                  dataReaderObject.DetachStream();
                  dataReaderObject = null;
              }
          }
      }
  
      /// &lt;summary&gt;
      /// ReadAsync: Task that waits on data and reads asynchronously from the serial device InputStream
      /// &lt;/summary&gt;
      /// &lt;param name="cancellationToken"&gt;&lt;/param&gt;
      /// &lt;returns&gt;&lt;/returns&gt;
      private async Task ReadAsync(CancellationToken cancellationToken)
      {
          Task&lt;UInt32&gt; loadAsyncTask;
  
          uint ReadBufferLength = 1024;
  
          // If task cancellation was requested, comply
          cancellationToken.ThrowIfCancellationRequested();
  
          // Set InputStreamOptions to complete the asynchronous read operation when one or more bytes is available
          dataReaderObject.InputStreamOptions = InputStreamOptions.Partial;
  
          // Create a task object to wait for data on the serialPort.InputStream
          loadAsyncTask = dataReaderObject.LoadAsync(ReadBufferLength).AsTask(cancellationToken);
  
          // Launch the task and wait
          UInt32 bytesRead = await loadAsyncTask;
          if (bytesRead &gt; 0)
          {
              rcvdText.Text = dataReaderObject.ReadString(bytesRead);
              status.Text = "bytes read successfully!";
          }            
      }
  
      /// &lt;summary&gt;
      /// CancelReadTask:
      /// - Uses the ReadCancellationTokenSource to cancel read operations
      /// &lt;/summary&gt;
      private void CancelReadTask()
      {         
          if (ReadCancellationTokenSource != null)
          {
              if (!ReadCancellationTokenSource.IsCancellationRequested)
              {
                  ReadCancellationTokenSource.Cancel();
              }
          }         
      }
  
      /// &lt;summary&gt;
      /// CloseDevice:
      /// - Disposes SerialDevice object
      /// - Clears the enumerated device Id list
      /// &lt;/summary&gt;
      private void CloseDevice()
      {            
          if (serialPort != null)
          {
              serialPort.Dispose();
          }
          serialPort = null;
  
          comPortInput.IsEnabled = true;
          sendTextButton.IsEnabled = false;            
          rcvdText.Text = "";
          listOfDevices.Clear();               
      }
  
      /// &lt;summary&gt;
      /// closeDevice_Click: Action to take when 'Disconnect and Refresh List' is clicked on
      /// - Cancel all read operations
      /// - Close and dispose the SerialDevice object
      /// - Enumerate connected devices
      /// &lt;/summary&gt;
      /// &lt;param name="sender"&gt;&lt;/param&gt;
      /// &lt;param name="e"&gt;&lt;/param&gt;
      private void closeDevice_Click(object sender, RoutedEventArgs e)
      {
          try
          {
              status.Text = "";
              CancelReadTask();
              CloseDevice();
              ListAvailablePorts();
          }
          catch (Exception ex)
          {
              status.Text = ex.Message;
          }          
      }        
    }
  }
  </code></pre>
  
  <p>This next block if from my code. Those first 2 lines in the<code>ConnectToSerialPort()</code> are the same as before for testing however <code>SerialDevice.FromIdAsync(dis[0].id);</code> is always null. <strong>This does not work!!</strong></p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.Diagnostics;
  using System.IO;
  using System.Linq;
  using Windows.Devices.Enumeration;
  using Windows.Devices.SerialCommunication;
  using Windows.Storage.Streams;
  using Windows.UI.Xaml.Controls;
  
  namespace OpenLab.Kitchen.Receiver
  {
  public sealed partial class MainPage : Page
  {
      private List&lt;byte&gt; Bytes { get; set; }
  
      public MainPage()
      {
          this.InitializeComponent();
          Bytes = new List&lt;byte&gt;();
          ConnectToSerialPort();
      }
  
      private async void ConnectToSerialPort()
      {
          var dis = await DeviceInformation.FindAllAsync(SerialDevice.GetDeviceSelectorFromUsbVidPid(0x04D8, 0x000A));
          var sp = await SerialDevice.FromIdAsync(dis[0].Id);
  
          Debug.WriteLine(sp.UsbVendorId);
  
          DeviceInformationCollection serialDevices;
  
          while ((serialDevices = await DeviceInformation.FindAllAsync(SerialDevice.GetDeviceSelectorFromUsbVidPid(0x04D8, 0x000A))).Count &lt; 1)
          {
              Debug.WriteLine("Unable to locate...");
          }
  
          SerialDevice serialPort;
  
          while ((serialPort = await SerialDevice.FromIdAsync(serialDevices[0].Id)) == null)
          {
              Debug.WriteLine("Failed to open serial port...");
          }
  
          serialPort.WriteTimeout = TimeSpan.FromMilliseconds(1000);
          serialPort.ReadTimeout = TimeSpan.FromMilliseconds(1000);
          serialPort.BaudRate = 9600;
          serialPort.Parity = SerialParity.None;
          serialPort.StopBits = SerialStopBitCount.One;
          serialPort.DataBits = 8;
          serialPort.Handshake = SerialHandshake.None;
  
          var dataReader = new DataReader(serialPort.InputStream);
          var buffer = new byte[1024];
  
          while (true)
          {
              var bytesRead = await dataReader.LoadAsync((uint)buffer.Length);
              dataReader.ReadBytes(buffer);
              Bytes.AddRange(buffer.Take((int)bytesRead));
  
              byte[] slipPacket;
              while ((slipPacket = Slip.ExtractSlipPacket(Bytes)) != null)
              {
                  var waxPacket = WaxPacketConverter.FromBinary(slipPacket, DateTime.Now);
                  if (waxPacket != null)
                  {
                      Debug.WriteLine(waxPacket);
                  }
              }
          }
      }
    }
  }
  </code></pre>
  
  <p>I have checked all the manifest permissions to match them up and checked stuff like referenced DLL versions and everything looks the same. Also checked things like running VS as admin and I haven't got both applications open at the same time so its not that one should be holding the port open or anything...</p>
  
  <p>Does anyone have any ideas?</p>