Как создать приложение C# maui Android, которое вставляет сериал в USB OTG Arduino
Я попробовал все пакеты Nuget для этого и не могу сделать это в Android, но я сдался с Libserialport.dll в Windows, что должно Я делаю сейчас? Я не могу заставить его запустить на Android правильно, этот код работает, за исключением последней операции, он вообще не работает правильно, и я уверен, что он справедливо читает устройство.
#if ANDROID
using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.Hardware.Usb;
using Android.OS;
using Android.Util;
using Hoho.Android.UsbSerial.Driver;
using Hoho.Android.UsbSerial.Util;
using Java.IO;
using Java.Lang;
using System;
#endif
using System.Collections.Generic;
using System.Text;
namespace DroneBrainPlus;
public static class ArduinoController
{
#if ANDROID
public static UsbManager? _usbManager;
private static IUsbSerialDriver? _usbSerialDriver;
private static IUsbSerialPort? _usbSerialPort;
private static UsbDeviceConnection? _connection;
public static async Task FindAndConnectToCH34x()
{
_usbManager = (UsbManager)Android.App.Application.Context.GetSystemService(Android.App.Application.UsbService);
// إنشاء جدول تعريف خاص بدعم CH34X
var customTable = UsbSerialProber.DefaultProbeTable;
customTable.AddProduct(0x1A86, 0x7523, Class.FromType(typeof(CdcAcmSerialDriver))); // CH340/CH341 VID/PID
// استخدام prober مخصص
var prober = new UsbSerialProber(customTable);
var availableDrivers = prober.FindAllDrivers(_usbManager);
if (availableDrivers.Count == 0)
{
await Shell.Current.DisplayAlert("USB", "No compatible USB serial device found.", "OK").ConfigureAwait(false);
return;
}
// الحصول على أول جهاز متاح
var usbSerialDriver = availableDrivers.FirstOrDefault();
if (usbSerialDriver == null)
{
await Shell.Current.DisplayAlert("USB", "No USB serial driver found.", "OK").ConfigureAwait(false);
return;
}
var device = usbSerialDriver.Device;
if (!_usbManager.HasPermission(device))
{
var permissionIntent = PendingIntent.GetBroadcast(Android.App.Application.Context, 0,
new Intent(UsbPermissionReceiver.ACTION_USB_PERMISSION), PendingIntentFlags.Immutable);
_usbManager.RequestPermission(device, permissionIntent);
await Shell.Current.DisplayAlert("USB", "Permission not granted for USB device.", "OK").ConfigureAwait(false);
return;
}
// فتح الاتصال
var connection = _usbManager.OpenDevice(device);
if (connection == null)
{
await Shell.Current.DisplayAlert("USB", "Failed to open USB device.", "OK").ConfigureAwait(false);
return;
}
// تأكد من أن هناك منافذ متاحة
if (usbSerialDriver.Ports.Count == 0)
{
await Shell.Current.DisplayAlert("USB", "No available serial ports.", "OK").ConfigureAwait(false);
return;
}
var usbSerialPort = usbSerialDriver.Ports.ElementAtOrDefault(0);
if (usbSerialPort == null)
{
await Shell.Current.DisplayAlert("USB", "No available serial ports.", "OK").ConfigureAwait(false);
return;
}
try
{
usbSerialPort.Open(connection);
usbSerialPort.SetParameters(9600, 8, StopBits.One, Parity.None);
}
catch (System.Exception ex)
{
await Shell.Current.DisplayAlert("Error", ex.Message, "OK").ConfigureAwait(false);
}
}
public static async void FindAndConnectOneDevice()
{
_usbManager = (UsbManager)Android.App.Application.Context.GetSystemService(Android.App.Application.UsbService);
var device = _usbManager.DeviceList.Values.FirstOrDefault();
if (device == null)
{
await Shell.Current.DisplayAlert("USB", "No USB device found.", "OK");
return;
}
// تحقق مما إذا كان لدينا الإذن للوصول إلى الجهاز
if (!_usbManager.HasPermission(device))
{
var permissionIntent = PendingIntent.GetBroadcast(Android.App.Application.Context, 0,
new Intent(UsbPermissionReceiver.ACTION_USB_PERMISSION), PendingIntentFlags.UpdateCurrent);
_usbManager.RequestPermission(device, permissionIntent);
await Shell.Current.DisplayAlert("USB", "Permission not granted for USB device.", "OK");
return;
}
// محاولة فتح اتصال بالجهاز
_connection = _usbManager.OpenDevice(device);
if (_connection == null)
{
await Shell.Current.DisplayAlert("USB", "Failed to open USB connection.", "OK");
return;
}
// الحصول على تعريف الجهاز
var usbSerialDriver = UsbSerialProber.DefaultProber.FindAllDrivers(_usbManager)
.FirstOrDefault(d => d.Device.DeviceId == device.DeviceId);
if (usbSerialDriver == null)
{
await Shell.Current.DisplayAlert("USB", "No compatible USB serial driver found.", "OK");
return;
}
// الحصول على المنفذ التسلسلي
var usbSerialPort = usbSerialDriver.Ports.FirstOrDefault();
if (usbSerialPort == null)
{
await Shell.Current.DisplayAlert("USB", "No available USB serial ports.", "OK");
return;
}
// فتح المنفذ وضبط إعداداته
usbSerialPort.Open(_connection);
usbSerialPort.SetParameters(9600, 8, StopBits.One, Parity.None);
}
public static async void FindAndConnectUsbDevice()
{
_usbManager = (UsbManager)Android.App.Application.Context.GetSystemService(Android.App.Application.UsbService);
var availableDrivers = UsbSerialProber.DefaultProber.FindAllDrivers(_usbManager);
if (availableDrivers.Count == 0)
{
await Shell.Current.DisplayAlert("USB", "No USB serial device found.", "Cancel");
return;
}
_usbSerialDriver = availableDrivers[0]; // افتراض استخدام أول جهاز متصل
_connection = _usbManager.OpenDevice(_usbSerialDriver.Device);
if (_connection == null)
{
var permissionIntent = PendingIntent.GetBroadcast(Android.App.Application.Context, 0,
new Intent(UsbPermissionReceiver.ACTION_USB_PERMISSION), PendingIntentFlags.UpdateCurrent);
_usbManager.RequestPermission(_usbSerialDriver.Device, permissionIntent);
await Shell.Current.DisplayAlert("USB", "USB Permission Denied.", "Cancel");
return;
}
_usbSerialPort = _usbSerialDriver.Ports[0];
_usbSerialPort.Open(_connection);
_usbSerialPort.SetParameters(9600, 8, StopBits.One, Parity.None);
SendData("Hello USB!");
ReadData();
}
public static async void SendData(string message)
{
if (_usbSerialPort == null) return;
byte[] buffer = Encoding.UTF8.GetBytes(message);
_usbSerialPort.Write(buffer, 1000);
await Shell.Current.DisplayAlert("USB", $"Sent: {message}", "Cancel");
}
private static async void ReadData()
{
if (_usbSerialPort == null) return;
byte[] buffer = new byte[64];
int numBytesRead = _usbSerialPort.Read(buffer, 1000);
if (numBytesRead > 0)
{
string receivedData = Encoding.UTF8.GetString(buffer, 0, numBytesRead);
await Shell.Current.DisplayAlert("USB", $"Received: {receivedData}", "Cancel");
}
}
//protected override void OnDestroy()
//{
// base.OnDestroy();
// _usbSerialPort?.Close();
// _connection?.Close();
//}
#endif
}
Подробнее здесь: https://stackoverflow.com/questions/794 ... -usb-otg-a
Как создать приложение C# Maui Android, которое вставляет сериал в USB OTG Arduino ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как создать приложение C# Maui Android, которое вставляет сериал в USB OTG Arduino
Anonymous » » в форуме Android - 0 Ответы
- 11 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как получить доступ к устройству USB через USB-OTG в приложении QT 6.9 Android?
Anonymous » » в форуме Android - 0 Ответы
- 5 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как получить доступ к устройству USB через USB-OTG в приложении QT 6.9 Android?
Anonymous » » в форуме C++ - 0 Ответы
- 2 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как получить доступ к устройству USB через USB-OTG в приложении QT 6.9 Android?
Anonymous » » в форуме Android - 0 Ответы
- 2 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как получить доступ к устройству USB через USB-OTG в приложении QT 6.9 Android?
Anonymous » » в форуме C++ - 0 Ответы
- 2 Просмотры
-
Последнее сообщение Anonymous
-