UsbDeviceConnection ControlTransfer()返回-1

时间:2015-01-27 13:07:23

标签: android xamarin xamarin.android usbserial

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

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与设备通信,但它总是返回-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);

1 个答案:

答案 0 :(得分:0)

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

我希望xamarin的某位读过这篇文章。当你使用商业应用程序时,面对这样的麻烦太烦人了,这太贵了!!