Как создать приложение C# Maui Android, которое вставляет сериал в USB OTG ArduinoC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как создать приложение C# Maui Android, которое вставляет сериал в USB OTG Arduino

Сообщение Anonymous »

Как создать приложение 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как создать приложение 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

Вернуться в «C#»