Search code examples
c#serial-portwin-universal-appserial-communication

How to write serial data to COM ports with Universal Windows Application?


Typically C# applications use System.IO.Ports like so:

SerialPort port = new SerialPort("COM1"); 
port.Open(); 
port.WriteLine("test");`

But Universal Windows Applications don't support System.IO.Ports so this method cannot be used. Does anyone know how to write serial data through COM ports in a UWA?


Solution

  • You can do this with the Windows.Devices.SerialCommunication and Windows.Storage.Streams.DataWriter classes:

    The classes provide functionality to discover such serial device, read and write data, and control serial-specific properties for flow control, such as setting baud rate, signal states.

    By adding the following capability to Package.appxmanifest:

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

    Then running the following code:

    using Windows.Devices.SerialCommunication;
    using Windows.Devices.Enumeration;
    using Windows.Storage.Streams;
    
    //...   
    
    string selector = SerialDevice.GetDeviceSelector("COM3"); 
    DeviceInformationCollection devices = await DeviceInformation.FindAllAsync(selector);
    if(devices.Count > 0)
    {
        DeviceInformation deviceInfo = devices[0];
        SerialDevice serialDevice = await SerialDevice.FromIdAsync(deviceInfo.Id);
        serialDevice.BaudRate = 9600;
        serialDevice.DataBits = 8;
        serialDevice.StopBits = SerialStopBitCount.Two;
        serialDevice.Parity = SerialParity.None;
    
        DataWriter dataWriter = new DataWriter(serialDevice.OutputStream);
        dataWriter.WriteString("your message here");
        await dataWriter.StoreAsync();
        dataWriter.DetachStream();
        dataWriter = null;
    }
    else
    {
        MessageDialog popup = new MessageDialog("Sorry, no device found.");
        await popup.ShowAsync();
    }