Skip to content

Commit e2a8594

Browse files
committed
serial buffer management
1 parent 4408e68 commit e2a8594

File tree

1 file changed

+28
-14
lines changed

1 file changed

+28
-14
lines changed

src/main/java/org/dpsoftware/managers/SerialManager.java

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,8 @@
3939
import org.dpsoftware.utilities.CommonUtility;
4040

4141
import java.awt.*;
42-
import java.io.BufferedReader;
4342
import java.io.IOException;
44-
import java.io.InputStreamReader;
43+
import java.nio.charset.StandardCharsets;
4544
import java.util.Date;
4645
import java.util.HashMap;
4746
import java.util.Map;
@@ -76,7 +75,7 @@ public void initSerial(String portName, String baudrate) {
7675
closeSerial();
7776
SerialPort[] ports = SerialPort.getCommPorts();
7877
int numberOfSerialDevices = 0;
79-
int readTimeout = MainSingleton.getInstance().config.getTimeout() * 15;
78+
int readTimeout = MainSingleton.getInstance().config.getTimeout();
8079
int writeTimeout = MainSingleton.getInstance().config.getTimeout();
8180
if (ports != null && ports.length > 0) {
8281
numberOfSerialDevices = ports.length;
@@ -92,7 +91,7 @@ public void initSerial(String portName, String baudrate) {
9291
MainSingleton.getInstance().serial = ports[0];
9392
}
9493
}
95-
MainSingleton.getInstance().serial.setDTRandRTS(true, false);
94+
MainSingleton.getInstance().serial.setDTRandRTS(false, false);
9695
if (MainSingleton.getInstance().serial != null && MainSingleton.getInstance().serial.openPort()) {
9796
int baudrateToUse = baudrate.isEmpty() ? Integer.parseInt(MainSingleton.getInstance().config.getBaudRate()) : Integer.parseInt(baudrate);
9897
MainSingleton.getInstance().serial.setComPortParameters(baudrateToUse, 8, 1, SerialPort.NO_PARITY);
@@ -157,8 +156,9 @@ public void initSerial(String portName, String baudrate) {
157156
private void listenSerialEvents() {
158157
// No autocloseable because this thread must not be terminated
159158
ExecutorService executor = Executors.newSingleThreadExecutor();
160-
// Aggiungi un listener per leggere i dati in modalità non bloccante
161159
MainSingleton.getInstance().serial.addDataListener(new SerialPortDataListener() {
160+
private StringBuilder lineBuffer = new StringBuilder();
161+
162162
@Override
163163
public int getListeningEvents() {
164164
return SerialPort.LISTENING_EVENT_DATA_AVAILABLE | SerialPort.LISTENING_EVENT_PORT_DISCONNECTED;
@@ -167,23 +167,37 @@ public int getListeningEvents() {
167167
@Override
168168
public void serialEvent(SerialPortEvent event) {
169169
if (event.getEventType() == SerialPort.LISTENING_EVENT_DATA_AVAILABLE) {
170-
executor.submit(() -> {
171-
try (BufferedReader reader = new BufferedReader(new InputStreamReader(MainSingleton.getInstance().serial.getInputStream()))) {
172-
while (reader.ready()) {
173-
String line = reader.readLine();
174-
handleSerialEvent(line);
175-
}
176-
} catch (Exception e) {
177-
log.error(e.getMessage());
170+
SerialPort serial = MainSingleton.getInstance().serial;
171+
int available = serial.bytesAvailable();
172+
if (available <= 0) return;
173+
174+
byte[] buffer = new byte[available];
175+
int numRead = serial.readBytes(buffer, buffer.length);
176+
if (numRead > 0) {
177+
String data = new String(buffer, StandardCharsets.UTF_8);
178+
lineBuffer.append(data);
179+
180+
String line;
181+
while ((line = extractLineFromBuffer(lineBuffer)) != null) {
182+
handleSerialEvent(line);
178183
}
179-
});
184+
}
180185
} else if (event.getEventType() == SerialPort.LISTENING_EVENT_PORT_DISCONNECTED) {
181186
log.info("USB device disconnected");
182187
SerialManager sm = new SerialManager();
183188
sm.closeSerial();
184189
scheduleReconnect();
185190
}
186191
}
192+
193+
// Get a complete line from the buffer, if present
194+
private String extractLineFromBuffer(StringBuilder buffer) {
195+
int idx = buffer.indexOf("\n");
196+
if (idx == -1) return null;
197+
String line = buffer.substring(0, idx).replaceAll("\r$", "");
198+
buffer.delete(0, idx + 1);
199+
return line;
200+
}
187201
});
188202
}
189203

0 commit comments

Comments
 (0)