Sto configurando un collegamento accessorio USB tra il mio telefono Android e un altro dispositivo. Basta inviare i byte avanti e indietro per ora per testare. All'inizio ho una comunicazione precisa, ma finisce sempre per morire con Java.io.IOException: write failed: EBADF (Bad file number)"
dopo circa un secondo. A volte la lettura rimane in vita ma la scrittura muore; altri muoiono entrambi.Java.io.IOException, connessione USB "numero file errato"
non sto facendo niente super elegante, lettura e scrittura, proprio come la documentazione di Google:
connessione iniziale (all'interno di un ricevitore di broadcast, so che questo parte funziona almeno inizialmente):
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);
}
}
Reading:
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();
scrittura:
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;
}
}
Errore stacktrace:
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
ho la registrazione in tutto il luogo e quindi so che non è qualcosa di troppo evidente, come ad esempio una nuova richiesta di autorizzazione in fase di ricezione (e quindi i flussi di file viene reinizializzata mid-lettura) . Anche i flussi non si stanno chiudendo, perché non ho mai potuto accadere da nessuna parte nel mio codice (per ora). Neanche io ricevo eventi distaccati o collegati (lo registro se succede). Nulla sembra troppo fuori dall'ordinario; muore e basta
Ho pensato che forse era un problema di concorrenza, quindi ho giocato con serrature e posti letto, niente ha funzionato che ho provato. Non penso che sia un problema di throughput o perché accade ancora quando dormo ogni lettura (su entrambe le estremità), e leggo un singolo pacchetto alla volta (bitrate super slow). C'è una possibilità che il buffer venga sovraccaricato dall'altra parte in qualche modo? Come farei a chiarire questo? Ho accesso al codice dell'altra parte, è anche un dispositivo Android, utilizzando la modalità Host. Nel caso in cui sia importante, posso postare anche quel codice: i trasferimenti di massa standard.
Il telefono ha solo il supporto scarno per la modalità accessorio Android? Ho provato due telefoni e entrambi falliscono allo stesso modo, quindi dubito che sia così.
Mi chiedo cosa causa questo errore in generale durante la scrittura o la lettura da USB su Android?
Quale versione di Android stai utilizzando? Inoltre, con cosa stai cercando di comunicare? Credo che con Accessory Mode (stai usando la modalità Open Access di Android?) Hai bisogno di un dispositivo host compatibile come Arduino o FT311D. – TronicZomB
Android 4.0.4. Posso ottenere la connessione iniziale bene, e non esiste un dispositivo "compatibile": se si inviano le richieste di controllo corrette, il telefono entra in modalità accessori se lo supporta. Una finestra di dialogo si apre sul mio telefono affermando che vede un accessorio - solo problemi con il mantenimento della connessione. –
Oh ok, aspetta che veda un accessorio, il che significa che il tuo telefono è in modalità host, quindi non la modalità accessoria, giusto? Quale dispositivo fornisce alimentazione, telefono al dispositivo o dispositivo che fornisce al telefono? – TronicZomB