如何使用.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
相关产品推荐
相关产品推荐

