From 0c0275675f58e82e21a66fffd6657c52947fa189 Mon Sep 17 00:00:00 2001 From: Kai Morich Date: Thu, 30 May 2024 18:57:39 +0200 Subject: [PATCH] SerialInputOutputManager.writeAsync(): handle SerialTimeoutException --- .../hoho/android/usbserial/DeviceTest.java | 9 +++++++++ .../util/SerialInputOutputManager.java | 19 ++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java b/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java index 2827342..8e43c64 100644 --- a/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java +++ b/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java @@ -1525,6 +1525,15 @@ public class DeviceTest { data = telnet.read(2); assertEquals(2, data.length); usb.ioManager.setReadTimeout(200); + + // with internal SerialTimeoutException + TestBuffer tbuf = new TestBuffer(usb.writeBufferSize + 2*usb.writePacketSize); + usb.ioManager.setWriteTimeout(20); // tbuf len >= 128, needs 133msec @ 9600 baud + usb.setParameters(9600, 8, 1, UsbSerialPort.PARITY_NONE); + telnet.setParameters(9600, 8, 1, UsbSerialPort.PARITY_NONE); + usb.ioManager.writeAsync(tbuf.buf); + while(!tbuf.testRead(telnet.read(-1))) + ; } @Test diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/util/SerialInputOutputManager.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/util/SerialInputOutputManager.java index 2d9b7b0..f6ee3ca 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/util/SerialInputOutputManager.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/util/SerialInputOutputManager.java @@ -9,6 +9,7 @@ package com.hoho.android.usbserial.util; import android.os.Process; import android.util.Log; +import com.hoho.android.usbserial.driver.SerialTimeoutException; import com.hoho.android.usbserial.driver.UsbSerialPort; import java.io.IOException; @@ -254,7 +255,23 @@ public class SerialInputOutputManager implements Runnable { if (DEBUG) { Log.d(TAG, "Writing data len=" + len); } - mSerialPort.write(buffer, mWriteTimeout); + try { + mSerialPort.write(buffer, mWriteTimeout); + } catch (SerialTimeoutException ex) { + synchronized (mWriteBufferLock) { + byte[] buffer2 = null; + int len2 = mWriteBuffer.position(); + if (len2 > 0) { + buffer2 = new byte[len2]; + mWriteBuffer.rewind(); + mWriteBuffer.get(buffer2, 0, len2); + mWriteBuffer.clear(); + } + mWriteBuffer.put(buffer, ex.bytesTransferred, buffer.length - ex.bytesTransferred); + if (buffer2 != null) + mWriteBuffer.put(buffer2); + } + } } }