我正在为我的安卓手机和另一台设备建立USB附件连接,目前只是发送字节进行测试。一开始通讯很正常,但是大约一秒后就会因为
我没有做任何特别复杂的事情,像Google文档上所说一样读取和写入:
初始连接(在广播接收器中,至少最初我知道这部分可以工作):
我在各个地方都有日志记录,因此我知道它不是任何太明显的问题,例如收到另一个权限请求(因此文件流在读取过程中重新初始化)。流也没有关闭,因为我从来没有在我的代码中发生这种情况(目前为止)。我也没有收到任何已分离或已连接事件(如果发生,我会记录下来)。似乎没有什么异常的情况;它只是停止了。
我想也许这是一个并发问题,所以我尝试了锁定和睡眠,但我尝试的一切都没有起作用。我认为这也不是吞吐量问题,因为当我每次读取时都睡眠(两端都是如此),并且一次只读取一个数据包(超慢的比特率)时,它仍然会发生。有可能缓冲区在另一端被溢出吗?我应该如何清除这个问题?我可以访问另一端的代码,它也是使用主机模式的Android设备。如果需要,我可以发布那段代码-标准的批量传输。
这个错误在Android上写入或读取USB时是什么原因引起的呢?
Java.io.IOException: write failed: EBADF (Bad file number)"
而停止。有时候读取仍然活着,但写入已经停止;其他情况两者都死了。我没有做任何特别复杂的事情,像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, 0, b, 0, 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, 0, 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上写入或读取USB时是什么原因引起的呢?
UsbAccessory
对象-您在配件模式下看到它们。该设备有点像Android平板电脑(我认为也是4.0.4);它正在为我的手机提供电源。它通过主机模式进行通信。最初所有这些都很正常,只是最终出现了“坏文件号”错误。 - user155407