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 f8c1a10..1654518 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 @@ -152,7 +152,16 @@ public class SerialInputOutputManager { */ public void writeAsync(byte[] data) { synchronized (mWriteBufferLock) { + while (mWriteBuffer.remaining() < data.length) { + try { + wait(); // Block until space is available in the buffer + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); // Restore the interrupt flag + return; // Exit gracefully + } + } mWriteBuffer.put(data); + notifyAll(); // Notify waiting threads } } @@ -184,6 +193,9 @@ public class SerialInputOutputManager { */ public void stop() { if(mState.compareAndSet(State.RUNNING, State.STOPPING)) { + synchronized (mWriteBufferLock) { + notifyAll(); // Wake up any waiting thread to check the stop condition + } Log.i(TAG, "Stop requested"); } } @@ -231,7 +243,7 @@ public class SerialInputOutputManager { * Continuously services the read buffers until {@link #stop()} is called, or until a driver exception is * raised. */ - private void runRead() { + void runRead() { Log.i(TAG, "runRead running ..."); try { setThreadPriority(); @@ -263,7 +275,7 @@ public class SerialInputOutputManager { * Continuously services the write buffers until {@link #stop()} is called, or until a driver exception is * raised. */ - private void runWrite() { + void runWrite() { Log.i(TAG, "runWrite running ..."); try { setThreadPriority(); @@ -311,7 +323,7 @@ public class SerialInputOutputManager { } } - private void stepWrite() throws IOException { + private void stepWrite() throws IOException, InterruptedException { // Handle outgoing data. byte[] buffer = null; synchronized (mWriteBufferLock) { @@ -321,12 +333,15 @@ public class SerialInputOutputManager { mWriteBuffer.rewind(); mWriteBuffer.get(buffer, 0, len); mWriteBuffer.clear(); + } else { + wait(); } } if (buffer != null) { if (DEBUG) { Log.d(TAG, "Writing data len=" + buffer.length); } + notifyAll(); // Notify writeAsync that there is space in the buffer mSerialPort.write(buffer, mWriteTimeout); } }