UsbDeviceConnection ControlTransfer() returns -1

UsbDeviceConnection ControlTransfer() returns -1

我一直在编写一个应用程序来与 xamarin 中的 CP2102 usb 串行芯片进行通信 android。我可以成功授予打开设备和声明接口的权限。打开设备后,我使用这些代码行来声明接口并获取端点:

for (int i = 0; i < mDevice.InterfaceCount; i++)
                {
                    UsbInterface usbIface = mDevice.GetInterface(i);
                    if (mConnection.ClaimInterface(usbIface, true))
                    {
                        Log.Debug(TAG, "claimInterface " + i + " SUCCESS");
                    }
                    else
                    {
                        Log.Debug(TAG, "claimInterface " + i + " FAIL");
                    }
                }

                UsbInterface dataIface = mDevice.GetInterface(mDevice
                        .InterfaceCount - 1);
                for (int i = 0; i < dataIface.EndpointCount; i++)
                {
                    UsbEndpoint ep = dataIface.GetEndpoint(i);
                    if (ep.Type == UsbAddressing.XferBulk)
                    {
                        if (ep.Direction == UsbAddressing.In)
                        {
                            mReadEndpoint = ep;
                        }
                        else
                        {
                            mWriteEndpoint = ep;
                        }
                    }
                }

然后我尝试使用 ControlTransfer 与设备通信,但它总是 returns -1。这是我为设置配置而编写的代码:

 int r = mConnection.ControlTransfer(UsbAddressing.Out, 0x00, 0x0001, 0, null, 0, 5000);

r 始终为 -1,表示通信存在错误,但当我 运行 在 java android 中执行此命令时,设备工作正常:

mConnection.controlTransfer(0x41, 0x00, 0x0001, 0, null, 0, 5000);

好的问题是 UsbAddressing.Out。它是0。根据芯片组的文档,这种类型的请求应该是0x41。说实话,我根本不应该问这个问题。似乎无法在 Xamarin 中使用这种类型的芯片,因为它不允许您发送自定义请求类型。您必须在 java 中编写代码并使用 JNI 导入它。据我所知,这是唯一适用的解决方案。我认为这是 xamarinusbserial project 他们也使用 JNI 的主要原因之一。

我希望 xamarin 中有人能读到这篇文章 post。这么贵的商业应用程序,遇到这样的麻烦太烦人了!!