AllOutOfSalt
AllOutOfSalt

Reputation: 1492

TransactionTooLargeException in UsbHost mode

I'm using usb-serial-for-android library and I am getting some strange results. After 2.5 hours of continuous communicating with the serial port and reading and writing successfully, I get this exception:

exception in UsbManager.openDevice
android.os.TransactionTooLargeException
at android.os.BinderProxy.transact(Native Method)
at android.hardware.usb.IUsbManager$Stub$Proxy.openDevice(IUsbManager.java:339)
at android.hardware.usb.UsbManager.openDevice(UsbManager.java:255)
at com.hoho.android.usbserial.driver.UsbSerialProber$1.probe(UsbSerialProber.java:63)
at com.hoho.android.usbserial.driver.UsbSerialProber.probeSingleDevice(UsbSerialProber.java:174)

But when i force close my app and then restart it, everything is fine and my app can communicate with the port again.

It maybe useful to mention that before the exception , I get this exception:

java.io.FileNotFoundException: /sdcard/log.txt: open failed: EMFILE (Too many open files)
at libcore.io.IoBridge.open(IoBridge.java:406)
at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
at java.io.FileWriter.<init>(FileWriter.java:58)
at org.example.myapp.util.L.log(L.java:32)

I use class L for logging purposes:

public class L {

    public  synchronized void log(String message){

        File logFile = new File("sdcard/log.txt");
           if (!logFile.exists())
           {
              try
              {
                 logFile.createNewFile();
              } 
              catch (IOException e)
              {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
              }
           }
           try
           {
              //BufferedWriter for performance, true to set append to file flag
              BufferedWriter buf = new BufferedWriter(new FileWriter(logFile, true)); 
              buf.append(new Date(DateProvider.getInstance().getCurrentDateAsMillisecs()).toString()+": "+message);
              buf.newLine();
              buf.close();
           }
           catch (IOException e)
           {
              // TODO Auto-generated catch block
              e.printStackTrace();
           }
    }

}

It seems that some kind of buffer or cache is getting filled and prevents communicating with the device.

How can I get rid of the exception?

Update:

Writing to log file never fails even though I'm getting the exception. It only affects communicating with usb device.

Upvotes: 1

Views: 368

Answers (3)

Sully
Sully

Reputation: 14943

public class L {

    public static File logFile = new File("sdcard/log.txt");

    public  synchronized void log(String message){        

       ....

Everytime you call new File you request a file resource from the system. As you keep doing it the system will complain that you opened too many files. To avoid this, request the file only once.

Upvotes: 1

Piyush Mattoo
Piyush Mattoo

Reputation: 16115

Can you not use getFilesDir() to pass the directory path while creating file

Upvotes: 1

Levente Kurusa
Levente Kurusa

Reputation: 1866

You are opening too many files. Problems I have found:
- You never close logFile
- You open the file in the log function, a static File would be better and could be initialized in a log_init(); function.
Or, make logFile an object variable and initialize it in the constructor.

I think solving these will solve your problem.

Upvotes: 1

Related Questions