3939import org .dpsoftware .utilities .CommonUtility ;
4040
4141import java .awt .*;
42- import java .io .BufferedReader ;
4342import java .io .IOException ;
44- import java .io . InputStreamReader ;
43+ import java .nio . charset . StandardCharsets ;
4544import java .util .Date ;
4645import java .util .HashMap ;
4746import 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