当前位置: 首页 > 知识库问答 >
问题:

是什么导致UsbRequest从队列方法抛出IO异常?

裘嘉树
2023-03-14

我正在尝试使用Mike Wakelly的android USB串行库通过USB串行与Arduino巨型克隆进行通信(谢谢!)我已经找出了权限错误,但现在我遇到了以下问题:

09-02 15:08:03.628  18694-18792/org.drivebuv.buvmonitor W/SerialInputOutputManager﹕ Run ending due to exception: Error queueing request.
java.io.IOException: Error queueing request.
        at org.drivebuv.buvmonitor.CdcAcmSerialDriver$CdcAcmSerialPort.read(CdcAcmSerialDriver.java:168)
        at org.drivebuv.buvmonitor.SerialInputOutputManager.step(SerialInputOutputManager.java:158)
        at org.drivebuv.buvmonitor.SerialInputOutputManager.run(SerialInputOutputManager.java:140)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:818)

方法如下。抛出错误的行是带有的if循环!要求队列(基本单位,目标长度)

public int read(byte[] dest, int timeoutMillis) throws IOException {
        if (mEnableAsyncReads) {
          final UsbRequest request = new UsbRequest();
          try {
            request.initialize(mConnection, mReadEndpoint);
            final ByteBuffer buf = ByteBuffer.wrap(dest);
            if (!request.queue(buf, dest.length)) {
              throw new IOException("Error queueing request.");
            }

            final UsbRequest response = mConnection.requestWait();
            if (response == null) {
              throw new IOException("Null response");
            }

            final int nread = buf.position();
            if (nread > 0) {
              Log.d(TAG, HexDump.dumpHexString(dest, 0, Math.min(32, dest.length)));
              return nread;
            } else {
              return 0;
            }
          } finally {
            request.close();
          }
        }

        final int numBytesRead;
        synchronized (mReadBufferLock) {
            int readAmt = Math.min(dest.length, mReadBuffer.length);
            numBytesRead = mConnection.bulkTransfer(mReadEndpoint, mReadBuffer, readAmt,
                    timeoutMillis);
            if (numBytesRead < 0) {
                // This sucks: we get -1 on timeout, not 0 as preferred.
                // We *should* use UsbRequest, except it has a bug/api oversight
                // where there is no way to determine the number of bytes read
                // in response :\ -- http://b.android.com/28023
                if (timeoutMillis == Integer.MAX_VALUE) {
                    // Hack: Special case "~infinite timeout" as an error.
                    return -1;
                }
                return 0;
            }
            System.arraycopy(mReadBuffer, 0, dest, 0, numBytesRead);
        }
        return numBytesRead;
    }

以前,他的CdcAcmSerialDriver里似乎有一只虫子。java在第319行:mDataInterface=mDevice。获取接口(1)

因此,我将1改为0,根据如何修复java修复了索引越界错误。lang.ArrayIndexOutOfBoundsException:长度=1;指数=1。最后搬走了他所有的房子。将java文件放入我的包中,以便编辑它们。甚至不确定这是否相关。

目前,我的应用程序在出现异常后挂起。一句话:我在这里的低级代码中游弋,并没有什么乱七八糟的东西了。你能给我指一下陆地吗?


共有1个答案

姬裕
2023-03-14

因此,在包括Chromium在内的所有代码示例中,没有一个实际检查请求的结果。队列看这里http://src.chromium.org/chrome/trunk/src/media/base/android/java/src/org/chromium/media/UsbMidiDeviceAndroid.java

if (!request.queue(buf, dest.length)) {
          throw new IOException("Error queueing request.");
}

因此,在代码内部,每当出现异常SerialInputOutputManager停止时,最好是在出现错误时重新运行它。

@Override
  public void onRunError(Exception e) {
   Log.d(TAG, "Runner stopped.");
   //restart if the error is the queue
}

或者让它不运行异常,但是requestWait很可能返回null。

如果我想出一个天才的解决方案,它将帮助我在我的github项目中使用这个库。

 类似资料:
  • null 为简洁起见,排除了getter和setter(用于所有字段)以及toString()。 我尽了最大的努力按照指导原则格式化代码,但它没有发生,请耐心等待。 @Entity@Table(name=“Products”)@XmlRootElement@NamedQueries({@NamedQuery(name=“Product.FindAll”,query=“从产品p中选择p”),@nam

  • 队列,和 栈一样,也是一种对数据的"存"和"取"有严格要求的 线性存储结构。 与栈结构不同的是, 队列的两端都"开口",要求数据只能从一端进,从另一端出,如图 1 所示: 图 1 队列存储结构 通常,称进数据的一端为 "队尾",出数据的一端为 "队头",数据元素进队列的过程称为 "入队",出队列的过程称为 "出队"。 不仅如此, 队列中数据的进出要遵循 "先进先出" 的原则,即最先进队列的数据元素

  • 问题内容: 我在Windows 7盒子中以angular-fullstack开始了angular应用。我安装了带有-g选项的npm软件包,包括grunt-bower- install。我首先通过运行创建了应用程序 yo角全栈应用程序名称 在创建应用程序期间也不例外。成功创建应用程序后,我尝试使用 发牢骚 期望服务器运行。但是“发脾气”失败了 运行“ bower-install:app”(bower

  • 下面是我的代码。当我运行它时,我在线程“main”java.lang.IndexOutOfBoundsException:Index:3、Size:2中得到异常,而不是我的异常消息。谁能解释一下我做错了什么,为什么会这样?谢谢!

  • 问题内容: 我在搜索我的网站上具有自动完成/提前输入功能。我看到他们有时是一个例外。我们正在使用代理服务器。 引起原因:java.net.ConnectException:连接被拒绝 这是我的编码方式 谁能告诉我为什么我只在某个时候得到这个例外?是否可能是由于从Android应用程序发出搜索请求而导致此异常,因为我们的网站不支持从android应用程序发出请求 问题答案: 当您尝试打开与IP地址/

  • 问题内容: 我将Java库打包为JAR,当我尝试从中调用方法时会抛出很多s。这些错误似乎随机出现。哪些类型的问题可能导致此错误? 问题答案: 这意味着你对库进行了一些不兼容的二进制更改,而无需重新编译客户端代码。 Java语言规范§13详细介绍了所有这些更改,最显着的是将非非私有字段/方法更改为,反之亦然。 根据新库重新编译客户端代码,你应该一切顺利。 更新:如果发布公共库,则应尽可能避免进行不兼