Найти в Дзене
c3n9

Работа с Serial Port в .NET MAUI (Android)

Оглавление

Введение

В этой статье мы рассмотрим, как использовать последовательный порт (Serial Port) в приложении .NET MAUI для Android. Мы будем работать с USB-устройствами, такими как Arduino, и отправлять данные через Serial Port.

Я использовал Arduino MEGA 2560, ESP32 и смартфон Google Pixel 7a для тестирования.

Мой проект доступен на GitHub: SerialPort-in-MAUI. Исходный код библиотеки для работы с USB: UsbSerialForAndroid.

Для работы с USB-устройствами в MAUI нет готовых библиотек в NuGet, поэтому мы будем использовать исходный код.

Добавление фильтра устройств

Скопируйте файл device_filter.xml из примера в папку Platforms/Android/Resources вашего проекта. Убедитесь, что Build Action установлено как AndroidResource.

Включение поддержки USB Host

Добавьте следующий атрибут в MainActivity.cs, чтобы включить поддержку USB Host:

[assembly: UsesFeature("android.hardware.usb.host")]

Добавление фильтра для обработки подключенных устройств

В MainActivity.cs добавьте IntentFilter, чтобы получать уведомления о подключении USB-устройств:

[IntentFilter(new[] { UsbManager.ActionUsbDeviceAttached })]

Привязка фильтра устройств

Добавьте MetaData, чтобы привязать device_filter.xml и обрабатывать только нужные устройства:

[MetaData(UsbManager.ActionUsbDeviceAttached, Resource = "@xml/device_filter")]

Интерфейс для работы с USB

Создайте глобальный интерфейс IUsbService для работы с USB-устройствами:

public interface IUsbService
{
Task<IEnumerable<string>> GetAvailablePortsAsync();
Task<bool> ConnectAsync(string portName);
Task SendMessageAsync(string message);
}

Реализация службы для Android

Создайте класс UsbServiceAndroid в папке Android, который реализует IUsbService.

С помощью DependencyService можно будет обращаться к платформозависимому коду для работы с USB.

Код прошивки Arduino

Приведенный ниже код позволяет управлять светодиодом через Serial Port. Если отправить 1 — светодиод включится, если 0 — выключится.

const int ledPin = LED_BUILTIN;
char commandValue;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
if (Serial.available()) {
commandValue = Serial.read();
if (commandValue == '1') {
Serial.println("1");
digitalWrite(ledPin, HIGH);
}
else if (commandValue == '0') {
Serial.println("2");
digitalWrite(ledPin, LOW);
}
}
delay(10);
}

Возможные примеры использования Serial Port

Работа с последовательным портом может пригодиться в различных сценариях:

  • Получение данных с датчиков – например, сбор информации о температуре, влажности, давлении и передача этих данных в мобильное приложение.
  • Автоматизация умного дома – управление умными устройствами через USB или Bluetooth.

Пример работы с LED-лентой

На видео показан пример управления LED-лентой через Serial Port. С помощью мобильного приложения, написанного на .NET MAUI, можно включать и выключать ленту, а также изменять её цвет.