USB Serial Communication on Android in .NET MAUI

A complete guide to USB serial communication in .NET MAUI Android apps: includes permission setup, device discovery, port opening, and data transfer.

  1. Add USB device permission settings.
    Refer to the project for configuration, library source code. For Android 14 and above, note the details.

  2. Search for USB serial devices.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    Android.App.Activity act = Platform.CurrentActivity;
    Android.Hardware.Usb.UsbManager manager = (Android.Hardware.Usb.UsbManager)act.GetSystemService(Android.Content.Context.UsbService);
    var table = Hoho.Android.UsbSerial.Driver.UsbSerialProber.DefaultProbeTable;
    table.AddProduct(0x1b4f, 0x0008, typeof(Hoho.Android.UsbSerial.Driver.CdcAcmSerialDriver)); // IOIO OTG
    table.AddProduct(0x09D8, 0x0420, typeof(Hoho.Android.UsbSerial.Driver.CdcAcmSerialDriver)); // Elatec TWN4
    
    var prober = new Hoho.Android.UsbSerial.Driver.UsbSerialProber(table);
    var list = prober.FindAllDrivers(manager);
    _UsbDevices.Clear();
    foreach (var item in list)
    {
        _UsbDevices.Add(item);
    }
    
  3. List device serial ports.
    Select one of the serial ports _UsbSerialPort.

    1
    2
    3
    4
    5
    
    _UsbSerialPorts.Clear();
    foreach (var item in _UsbDevice.Ports)
    {
        _UsbSerialPorts.Add(item);
    }
    
  4. Open the serial port.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    
    Android.App.Activity act = Platform.CurrentActivity;
    //var portInfo = act.Intent.GetParcelableExtra("PortInfo") as Hoho.Android.UsbSerial.Extensions.UsbSerialPortInfo;
    //int vendorId = portInfo.VendorId;
    //int deviceId = portInfo.DeviceId;
    //int portNumber = portInfo.PortNumber;
    
    Android.Hardware.Usb.UsbManager manager = (Android.Hardware.Usb.UsbManager)act.GetSystemService(Android.Content.Context.UsbService);
    
    //var table = Hoho.Android.UsbSerial.Driver.UsbSerialProber.DefaultProbeTable;
    //table.AddProduct(0x1b4f, 0x0008, typeof(Hoho.Android.UsbSerial.Driver.CdcAcmSerialDriver)); // IOIO OTG
    
    //table.AddProduct(0x09D8, 0x0420, typeof(Hoho.Android.UsbSerial.Driver.CdcAcmSerialDriver)); // Elatec TWN4
    
    //var prober = new Hoho.Android.UsbSerial.Driver.UsbSerialProber(table);
    //var list = prober.FindAllDrivers(manager);
    //var first = list.FirstOrDefault();
    //Hoho.Android.UsbSerial.Driver.UsbSerialPort port = first.Ports[0];
    
    //IDictionary<string, Android.Hardware.Usb.UsbDevice> devicesDictionary = manager.DeviceList;
    
    //Android.Hardware.Usb.UsbDevice dvc = devicesDictionary.ElementAt(0).Value;
    // Request permission to access the serial port
    var permissionGranted = await manager.RequestPermissionAsync(_UsbDevice.Device, act.ApplicationContext);
    if (permissionGranted)
    {
        if (serialInputOutputManager == null)
        {
            serialInputOutputManager = new Hoho.Android.UsbSerial.Extensions.SerialInputOutputManager(_UsbSerialPort)
            {
                BaudRate = 115200,
                DataBits = 8,
                StopBits = Hoho.Android.UsbSerial.Driver.StopBits.One,
                Parity = Hoho.Android.UsbSerial.Driver.Parity.None,
            };
            serialInputOutputManager.DataReceived += (sender, e) => {
    
            };
    
            serialInputOutputManager.ErrorReceived += (sender, e) => {
    
            };
        }
    
        try
        {
            if (!serialInputOutputManager.IsOpen)
            {
                serialInputOutputManager.Open(manager);
            }
        }
        catch (Exception ex)
        {
            return;
        }
    }
    
  5. Write data.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    
    try
    {
        byte[] sleepdata = new byte[] { 0xf0, 0x04, 0x10, 0xf1 };
        if (serialInputOutputManager.IsOpen)
        {
            _UsbSerialPort.Write(sleepdata, 200);
        }
    }
    catch (Exception ex)
    {
        return;
    }
    
  6. Close the serial port.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    try
    {
        if (serialInputOutputManager.IsOpen)
        {
            serialInputOutputManager.Close();
        }
    }
    catch (Exception ex)
    {
        return;
    }
    
Built with Hugo
Theme Stack designed by Jimmy