2

我正在尝试从 Android 中的定制 USB 设备(作为从设备工作)读取数据。我能够使用以下代码将数据写入设备:

UsbRequest request = new UsbRequest();
request.initialize(_outConnection, _outEndpoint);

int bufferDataLength = _outEndpoint.getMaxPacketSize();

ByteBuffer buffer = ByteBuffer.allocate(bufferDataLength + 1);
buffer.put(bytes);
if (request.queue(buffer, bufferDataLength)) {
            UsbRequest req = _outConnection.requestWait(); }

我在我的设备连接到的调试板上看到了结果。我正在尝试使用相同的方法来读取数据,但显然这不起作用:

int siz = 1; 
ByteBuffer res = ByteBuffer.allocate(siz + 1);
UsbRequest request = new UsbRequest();
request.initialize(_inConnection, _inEndpoint);
request.queue(res, siz); // This return false always

我究竟做错了什么?我不知道发回的数据包的大小 - 但我假设我总是能够读取 1 个字节。

我的设备具有带两个中断端点(IN 和 OUT)的 HID 接口

4

1 回答 1

1

我不知道是什么解决了这个问题,但现在它可以工作了。我已经从头开始重写了所有内容。我想我没有使用此代码(我认为它是用于用户通知,我不需要它。但似乎它是别的东西) - 这就是它不起作用的主要原因:

// Create and intent and request a permission.
    PendingIntent mPermissionIntent = PendingIntent.getBroadcast(_context, 0, new Intent(ACTION_USB_PERMISSION), 0);
    IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
    _context.registerReceiver(mUsbReceiver, filter);

我做过的几件事帮助我实现了稳定的连接:

1)每次需要时关闭和打开连接。我知道这听起来很奇怪,但这是我让它稳定的唯一方法。如果我尝试使用长期连接,由于某种原因它会损坏并在一段时间后停止工作。

2)在永无止境的while循环中连续读取。我还在我的所有线程中放了一些短暂的睡眠——这有助于以更实时的方式阅读。

3) 锁定设备(同步)。我不会同时打开写入和读取连接。

我没有为这个项目分配太多时间,而且这个项目只是一个演示 - 所以所有这些都非常适合我们。我想如果多花一点时间,其中一些东西可能会被改写成更好的东西。

于 2013-04-04T08:33:39.243 回答