加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java.io.IOException,“坏文件号”USB连接

发布时间:2020-12-14 16:23:37 所属栏目:Java 来源:网络整理
导读:我正在 Android手机和另一台设备之间建立USB连接.现在只需发送字节来测试.我得到一些明确的沟通,但是它总是最终死于Java.io.IOException:写入失败:EBADF(错误的文件编号)“一秒钟以后有时阅读保持活着,但写作死亡;其他两个死. 我没有像Google文档那样做任
我正在 Android手机和另一台设备之间建立USB连接.现在只需发送字节来测试.我得到一些明确的沟通,但是它总是最终死于Java.io.IOException:写入失败:EBADF(错误的文件编号)“一秒钟以后有时阅读保持活着,但写作死亡;其他两个死.

我没有像Google文档那样做任何超级花哨,阅读和写作:

初始连接(在广播接收器内,我知道这部分至少起初)

if (action.equals(ACTION_USB_PERMISSION))
{
    ParcelFileDescriptor pfd = manager.openAccessory(accessory);
    if (pfd != null) {
        FileDescriptor fd = pfd.getFileDescriptor();
        mIn = new FileInputStream(fd);
        mOut = new FileOutputStream(fd);
    }
}

读:

Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        byte[] buf = new byte[BUF_SIZE];
        while (true)
        {
            try {
                int recvd = mIn.read(buf);
                if (recvd > 0) {
                    byte[] b = new byte[recvd];
                    System.arraycopy(buf,b,recvd);
                    //Parse message
                }
            }
            catch (IOException e) {
                Log.e("read error","failed to read from stream");
                e.printStackTrace();
            }
        }
    }
});
thread.start();

写作:

synchronized(mWriteLock) {
    if (mOut !=null && byteArray.length>0) {
        try {
            //mOut.flush();
            mOut.write(byteArray,byteArray.length);
        }
        catch (IOException e) {
            Log.e("error","error writing");
            e.printStackTrace();
            return false;
        }
    }
    else {
        Log.e(TAG,"Can't send data,serial stream is null");
        return false;
    }
}

错误堆栈跟踪:

java.io.IOException: write failed: EBADF (Bad file number)
W/System.err(14028):     at libcore.io.IoBridge.write(IoBridge.java:452)
W/System.err(14028):     at java.io.FileOutputStream.write(FileOutputStream.java:187)
W/System.err(14028):     at com.my.android.transport.MyUSBService$5.send(MyUSBService.java:468)
W/System.err(14028):     at com.my.android.transport.MyUSBService$3.onReceive(MyUSBService.java:164)
W/System.err(14028):     at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:781)
W/System.err(14028):     at android.os.Handler.handleCallback(Handler.java:608)
W/System.err(14028):     at android.os.Handler.dispatchMessage(Handler.java:92)
W/System.err(14028):     at android.os.Looper.loop(Looper.java:156)
W/System.err(14028):     at android.app.ActivityThread.main(ActivityThread.java:5045)
W/System.err(14028):     at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err(14028):     at java.lang.reflect.Method.invoke(Method.java:511)
W/System.err(14028):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
W/System.err(14028):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
W/System.err(14028):     at dalvik.system.NativeStart.main(Native Method)
W/System.err(14028): Caused by: libcore.io.ErrnoException: write failed: EBADF (Bad file number)
W/System.err(14028):     at libcore.io.Posix.writeBytes(Native Method)
W/System.err(14028):     at libcore.io.Posix.write(Posix.java:178)
W/System.err(14028):     at libcore.io.BlockGuardOs.write(BlockGuardOs.java:191)
W/System.err(14028):     at libcore.io.IoBridge.write(IoBridge.java:447)
W/System.err(14028):     ... 13 more

我已经记录了整个地方,因此我知道这并不是什么太明显的,例如接收到另一个许可请求(因此文件流被重新初始化为中间读取).流也没有关闭,因为我从来没有发生在我的代码中的任何地方(现在).我没有得到任何分离或附加的事件(我记录,如果发生).没有什么似乎太普通了;它只是死了

我以为也许是一个并发问题,所以我玩锁和睡觉,没有任何工作,我试过.我不认为这是一个吞吐量问题,因为它仍然发生在我每次读取(在两端),并一次读取一个单一的数据包(超慢比特率).缓冲区是否有机会在另一端超支?我该如何解决这个问题?我可以访问另一端的代码,它也是一个Android设备,使用主机模式.如果重要,我可以发布该代码 – 标准批量传输.

手机对Android配件模式是否缺乏支持?我试过两个手机,他们都失败了,所以我怀疑是这样的.

我想知道在Android上从USB写入或读取时,一般会导致此错误的原因?

解决方法

它最终成为一个线程问题.我需要更好地分离甚至写作,而不是阅读.

我以this code为基础.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读