From 5eb7ee925e46c016244400f5532aa5f29542710c Mon Sep 17 00:00:00 2001 From: FrozenOne Date: Mon, 12 Jun 2017 14:23:59 +0200 Subject: [PATCH] Fix reads that do not use packets getting stuck in infinite loop. --- .../com/fazecast/jSerialComm/SerialPort.java | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/fazecast/jSerialComm/SerialPort.java b/src/main/java/com/fazecast/jSerialComm/SerialPort.java index e8d3801..b19b833 100644 --- a/src/main/java/com/fazecast/jSerialComm/SerialPort.java +++ b/src/main/java/com/fazecast/jSerialComm/SerialPort.java @@ -989,18 +989,21 @@ public final class SerialPort byte[] newBytes = new byte[numBytesAvailable]; newBytesIndex = 0; bytesRemaining = readBytes(portHandle, newBytes, newBytes.length); - while (bytesRemaining >= (dataPacket.length - dataPacketIndex)) - { - System.arraycopy(newBytes, newBytesIndex, dataPacket, dataPacketIndex, dataPacket.length - dataPacketIndex); - bytesRemaining -= (dataPacket.length - dataPacketIndex); - newBytesIndex += (dataPacket.length - dataPacketIndex); - dataPacketIndex = 0; - userDataListener.serialEvent(new SerialPortEvent(SerialPort.this, LISTENING_EVENT_DATA_RECEIVED, dataPacket.clone())); + if(dataPacket.length == 0) { + userDataListener.serialEvent(new SerialPortEvent(SerialPort.this, LISTENING_EVENT_DATA_RECEIVED, newBytes.clone())); } - if (bytesRemaining > 0) - { - System.arraycopy(newBytes, newBytesIndex, dataPacket, dataPacketIndex, bytesRemaining); - dataPacketIndex += bytesRemaining; + else { + while (bytesRemaining >= (dataPacket.length - dataPacketIndex)) { + System.arraycopy(newBytes, newBytesIndex, dataPacket, dataPacketIndex, dataPacket.length - dataPacketIndex); + bytesRemaining -= (dataPacket.length - dataPacketIndex); + newBytesIndex += (dataPacket.length - dataPacketIndex); + dataPacketIndex = 0; + userDataListener.serialEvent(new SerialPortEvent(SerialPort.this, LISTENING_EVENT_DATA_RECEIVED, dataPacket.clone())); + } + if (bytesRemaining > 0) { + System.arraycopy(newBytes, newBytesIndex, dataPacket, dataPacketIndex, bytesRemaining); + dataPacketIndex += bytesRemaining; + } } } }