我试图让一个安卓平板电脑与一个USB设备(STM32 Nucleo)进行通信。 我开发了一个草图,可在 github :
我设法使用Android.hardware.usb API使其工作。 但我必须使用本地C共享对象库进行通信,因为它在其他平台上使用,这就是 我现在有麻烦了 . 我使用swig嵌入了这个库,并使用VS Studio构建它。 我尝试了两种方法来使库与设备进行通信。
这两个方法都失败了,并返回一个关于不存在的fd的错误。我检查了fd和enpoints的值,它们和安卓系统是一样的。 我启动了安卓的usb设备监视器,我找不到创建的fd。我无法使用任何安卓的shell,比如termux来列出进程/proc树。 但我仍然可以在安卓系统中使用它们。
我从社区里查到,把fd传给本地库是正确的方法。 我不知道现在该怎么做,是否有更多的权限可以请求?
Below is how I retrieve the fd :
_devHandle.usbdev = _devHandle.usbManager.DeviceList[name];
// Ask for permission to access the created device
if (!_devHandle.usbManager.HasPermission(_devHandle.usbdev))
PendingIntent pi = PendingIntent.GetBroadcast((ContextWrapper)_context, 0, new Intent(ACTION_USB_PERMISSION), 0);
_devHandle.usbManager.RequestPermission(_devHandle.usbdev, pi);
/* We check the permission was given
if (!_devHandle.usbManager.HasPermission(_devHandle.usbdev))
// Loose !
Log.Debug("pandavcom", "FAILED : did not have persmission to open device" + _devHandle.usbdev.DeviceName);
return;
// Now open the port, with the USB Manager : we get the fd/enpoints and pass it to library, no more
_devHandle.connection = _devHandle.usbManager.OpenDevice(_devHandle.usbdev);
if (_devHandle.connection != null)
if (OpenInterface(_devHandle.usbdev, _devHandle.connection, ref _devHandle.usbIface, ref _devHandle.ep_in, ref _devHandle.ep_out) == 0)
_devHandle.fd = _devHandle.connection.FileDescriptor;
Log.Debug("pandavcom", "opened device endpoint" + _devHandle.usbdev.DeviceName + "with descriptor: " + _devHandle.fd);
Log.Debug("pandavcom", "FAILED : open device endpoint" + _devHandle.usbdev.DeviceName);