Android telefonumla başka bir cihaz arasında bir USB aksesuar bağlantısı kuruyorum. Şimdilik test etmek için sadece baytlar gönderiyorum. İlk başta kesin bir iletişim kuruyorum, ama her seferinde Java.io.IOException: write failed: EBADF (Bad file number)"
ile ölüyor. Bazen okuma canlı kalır, ancak yazı ölür; diğerleri de ölür.Java.io.IOException, "hatalı dosya numarası" USB bağlantısı
Okumayı ve sadece Google belgelerine gibi yazma, süper fantezi hiçbir şey yapmıyorum:
İlk bağlantısı (bir yayın alıcı içinde, bu bölüm en azından başlangıçta çalıştığını biliyorum):
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);
}
}
Okuma:
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();
Yazma:
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;
}
}
Hata 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
Tüyler her yere giriş ve böylece ben böyle başka izin isteği alınıyor (ve dolayısıyla dosya akışları orta okunan yeniden başlatıldı edilmektedir) gibi, çok bariz şey olmadığını biliyorum . Akarsular da kapanmıyor, çünkü hiçbir zaman benim kodumda hiçbir zaman bu olmadı (şimdilik). Ayrılmış ya da iliştirilmiş olaylar almıyorum (eğer böyle bir şey olursa olsun). Hiçbir şey sıradan değil gibi görünüyor; Sadece ölür.
Belki bir eşzamanlılık sorunu olduğunu düşündüm, bu yüzden kilitler ve uykularla oynadım, denediğim hiçbir şey işe yaramadı. Her ne kadar her okumada (her iki uçta) uyuduğumda ve bir seferde tek bir paket okuduğumda (süper yavaş bit hızı) hala geçerli olduğu için bir iş çıktısı sorun değil. Bir şekilde diğer tarafta tamponun taşması ihtimali var mı? Bunu temizlemek için nasıl giderim? Diğer ucun koduna erişimim var, bu da bir Android cihazı ve Host modunu kullanıyor. Önemli olduğu takdirde, bu kodu da - standart toplu transferler gönderebilirim.
Telefonda Android Aksesuar Modu için yeterli destek yok mu? İki telefonu denedim ve ikisi de benzer şekilde başarısız oluyor, bu yüzden bundan şüpheliyim.
Genel olarak Android'deki USB'den yazarken veya okurken bu hatanın neden kaynaklandığını merak ediyorum.
Hangi Android sürümünü kullanıyorsunuz? Ayrıca, ne ile iletişim kurmaya çalışıyorsunuz? Aksesuar Modu ile (Android Açık Aksesuar Modunu mu kullanıyorsunuz?) Arduino ya da FT311D gibi uyumlu bir ana bilgisayara ihtiyacınız olduğuna inanıyorum. – TronicZomB
Android 4.0.4. İlk bağlantıyı gayet iyi anlayabiliyorum ve "uyumlu" bir cihaz diye bir şey yok - doğru kontrol isteklerini gönderirseniz, telefon destekliyorsa telefon aksesuar modunda ilerler. Telefonumda bir aksesuar göründüğünü belirten bir iletişim kutusu açılıyor - sadece bağlantıyı sürdürmede sorun yaşıyorum. –
Tamam, bekle bir aksesuar görüyor, yani telefonun ana modda olduğu anlamına geliyor, aksesuar modu değil mi? Telefonu hangi cihaza, güce, cihaza veya cihaza sağlayan cihaz sağlıyor? – TronicZomB