You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用.NET MAUI向USB连接的设备写入原始数据

.NET MAUI Android USB原始数据发送实现思路

关于System.IO.Ports.SerialPort的说明

System.IO.Ports.SerialPort 主要适配Windows桌面平台的传统串口设备,无法直接在Android的.NET MAUI项目中使用——Android的USB外设通信依赖原生USB Host API,和桌面端串口驱动模型完全不同。

可行的实现方案

1. 基于Android原生USB Host API的平台特定实现

这是最可靠的方案,直接调用Android系统提供的USB接口,通过.NET MAUI的平台代码能力完成开发:

  • 第一步:配置权限
    在Android项目的AndroidManifest.xml中添加USB Host相关权限:

    <uses-feature android:name="android.hardware.usb.host" android:required="true" />
    <uses-permission android:name="android.permission.USB_PERMISSION" />
    

    针对Android 6.0及以上版本,还需要在代码中动态申请USB设备访问权限。

  • 第二步:编写Android平台代码
    在Android项目中创建USB通信实现类,使用Android.Hardware.Usb命名空间下的类完成设备枚举、权限请求、数据传输:

    using Android.Hardware.Usb;
    using Android.Content;
    using Android.App;
    
    public class UsbDeviceCommunicator
    {
        private UsbManager _usbManager;
        private UsbDeviceConnection _connection;
        private UsbEndpoint _outEndpoint;
    
        public UsbDeviceCommunicator()
        {
            _usbManager = (UsbManager)Application.Context.GetSystemService(Context.UsbService);
        }
    
        // 根据VID/PID查找目标设备
        public UsbDevice FindTargetDevice(int vendorId, int productId)
        {
            foreach (var device in _usbManager.DeviceList.Values)
            {
                if (device.VendorId == vendorId && device.ProductId == productId)
                {
                    return device;
                }
            }
            return null;
        }
    
        // 请求权限并打开设备连接
        public bool OpenDevice(UsbDevice device)
        {
            // 发送权限请求广播
            var permissionIntent = PendingIntent.GetBroadcast(Application.Context, 0, new Intent("com.yourapp.USB_PERMISSION"), PendingIntentFlags.Immutable);
            _usbManager.RequestPermission(device, permissionIntent);
    
            // 权限通过后打开连接
            _connection = _usbManager.OpenDevice(device);
            if (_connection == null) return false;
    
            // 获取通信接口与输出端点(需根据设备协议调整接口、端点索引)
            var usbInterface = device.GetInterface(0);
            if (!_connection.ClaimInterface(usbInterface, true)) return false;
    
            _outEndpoint = usbInterface.GetEndpoint(0);
            return true;
        }
    
        // 发送原始字节数据
        public int SendRawData(byte[] data)
        {
            if (_connection == null || _outEndpoint == null) return -1;
            return _connection.BulkTransfer(_outEndpoint, data, data.Length, 5000);
        }
    
        // 关闭连接释放资源
        public void CloseDevice()
        {
            if (_connection != null)
            {
                var usbInterface = _connection.GetDevice().GetInterface(0);
                _connection.ReleaseInterface(usbInterface);
                _connection.Close();
                _connection = null;
            }
        }
    }
    
  • 第三步:在MAUI共享代码中调用
    通过.NET MAUI的依赖注入或DependencyService,在共享代码中调用Android平台的USB通信逻辑:

    // 共享代码定义接口
    public interface IUsbCommunicator
    {
        bool Connect(int vendorId, int productId);
        int SendData(byte[] data);
        void Disconnect();
    }
    
    // Android项目实现接口并标记依赖服务
    [assembly: Dependency(typeof(UsbDeviceCommunicator))]
    public class UsbDeviceCommunicator : IUsbCommunicator
    {
        private readonly UsbDeviceCommunicator _usbComm = new();
    
        public bool Connect(int vendorId, int productId)
        {
            var device = _usbComm.FindTargetDevice(vendorId, productId);
            return device != null && _usbComm.OpenDevice(device);
        }
    
        public int SendData(byte[] data) => _usbComm.SendRawData(data);
    
        public void Disconnect() => _usbComm.CloseDevice();
    }
    

2. 寻找支持.NET MAUI的第三方USB库

可以搜索针对.NET MAUI的USB Host/串口通信类库,优先选择维护活跃的项目。部分原有的.NET USB库(如基于Device.Net/Usb.Net的社区分支)可能已更新支持.NET MAUI,可尝试适配或直接使用。

关键注意事项

  • 设备识别:必须提前获取目标设备的Vendor ID (VID)和Product ID (PID),用于精准筛选设备。
  • 权限处理:Android系统要求用户手动授权应用访问USB设备,需处理权限请求的回调逻辑。
  • 资源管理:在应用进入后台、页面销毁时,务必关闭USB连接并释放相关资源,避免内存泄漏。
  • 数据协议:根据目标设备的通信协议,调整端点类型、传输方式(批量传输/中断传输等)和数据格式。

内容的提问来源于stack exchange,提问作者paweltru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 14:06:39