Fix reads that do not use packets getting stuck in infinite loop.

This commit is contained in:
FrozenOne 2017-06-12 14:23:59 +02:00
parent 46790676e6
commit 5eb7ee925e
1 changed files with 14 additions and 11 deletions

View File

@ -989,21 +989,24 @@ public final class SerialPort
byte[] newBytes = new byte[numBytesAvailable]; byte[] newBytes = new byte[numBytesAvailable];
newBytesIndex = 0; newBytesIndex = 0;
bytesRemaining = readBytes(portHandle, newBytes, newBytes.length); bytesRemaining = readBytes(portHandle, newBytes, newBytes.length);
while (bytesRemaining >= (dataPacket.length - dataPacketIndex)) if(dataPacket.length == 0) {
{ userDataListener.serialEvent(new SerialPortEvent(SerialPort.this, LISTENING_EVENT_DATA_RECEIVED, newBytes.clone()));
}
else {
while (bytesRemaining >= (dataPacket.length - dataPacketIndex)) {
System.arraycopy(newBytes, newBytesIndex, dataPacket, dataPacketIndex, dataPacket.length - dataPacketIndex); System.arraycopy(newBytes, newBytesIndex, dataPacket, dataPacketIndex, dataPacket.length - dataPacketIndex);
bytesRemaining -= (dataPacket.length - dataPacketIndex); bytesRemaining -= (dataPacket.length - dataPacketIndex);
newBytesIndex += (dataPacket.length - dataPacketIndex); newBytesIndex += (dataPacket.length - dataPacketIndex);
dataPacketIndex = 0; dataPacketIndex = 0;
userDataListener.serialEvent(new SerialPortEvent(SerialPort.this, LISTENING_EVENT_DATA_RECEIVED, dataPacket.clone())); userDataListener.serialEvent(new SerialPortEvent(SerialPort.this, LISTENING_EVENT_DATA_RECEIVED, dataPacket.clone()));
} }
if (bytesRemaining > 0) if (bytesRemaining > 0) {
{
System.arraycopy(newBytes, newBytesIndex, dataPacket, dataPacketIndex, bytesRemaining); System.arraycopy(newBytes, newBytesIndex, dataPacket, dataPacketIndex, bytesRemaining);
dataPacketIndex += bytesRemaining; dataPacketIndex += bytesRemaining;
} }
} }
} }
}
else if ((eventFlags & LISTENING_EVENT_DATA_AVAILABLE) > 0) else if ((eventFlags & LISTENING_EVENT_DATA_AVAILABLE) > 0)
userDataListener.serialEvent(new SerialPortEvent(SerialPort.this, LISTENING_EVENT_DATA_AVAILABLE)); userDataListener.serialEvent(new SerialPortEvent(SerialPort.this, LISTENING_EVENT_DATA_AVAILABLE));
break; break;