我一直在编写一个应用程序,用于与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);
答案 0 :(得分:0)
好的问题是UsbAddressing.Out。根据芯片组的文档,这种类型的请求应为0x41。为了表达信任,我根本不应该问这个问题。似乎在Xamarin中使用这种类型的芯片是不可能的,因为它不允许您发送自定义请求类型。您必须在java中编写代码并使用JNI导入它。据我所知,这是唯一适用的解决方案。我认为这也是xamarinusbserial project他们使用JNI的主要原因之一。
我希望xamarin的某位读过这篇文章。当你使用商业应用程序时,面对这样的麻烦太烦人了,这太贵了!!