rxtx leggere porta seriale da java

Ciao a tutti,

volevo provare a realizzare un programmino semplice in java che mi stampi a video ciò che arduino invia sulla seriale. PS. utilizzo un Arduino DUE, ma la procedura penso sia uguale per tutti....

primo passo, ho installato NetBeans 8.0 secondo passo: ho scaricato le librerie rxtx 2.1.7 bins r2 terzo passo: importo tali librerie jar + le librerie inserite nella cartella lib di arduino 1.5.7 (ricordo che sto lavorando con arduino 2)

quarto passo: scrittura del programma....

per prima cosa importo le varie librerie

import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import java.io.InputStream;
import java.io.OutputStream;
import processing.app.Preferences;

benissimo, arrivato a questo punto mi blocco... qualsiasi tutorial che ho trovato non ne vuole sapere di girare... sempre mille errori (non vorrei che, trattandosi di guide datate 2007-2012, si basino su versioni obsolete delle librerie importate)... come posso procedere?

fonte (una delle tante a me non funzionanti): http://silveiraneto.net/2009/03/01/arduino-and-java/ vi ringrazio in anticipo

Premetto che con Java sto a zero, ma ho paura che con le guide in circolazione sull'IDE 1.5.7 ci farai ben poco. Esse sono scritte quasi tutte per l'ambiente 1.0.x, ed anche per quello non tutte portano a risultati. Io, ad esempio, non son mai riuscito ad usare Eclipse/Netbeans per programmare Arduino. Alla fine ho continuato ad usare l'IDE originale, per pessimo che sia.

Praticamente vuoi scrivere un Terminale come quello presente nel IDE? Penso che devi rivolgerti a un Forum di JAVA. Ciao Uwe

Oltretutto rxtx è stato recentissimamente abbandonato in favore di un nuovo sistema per la gestione della comunicazione seriale che si basa su jssc proprio per i problemi che rxtx dava.

Ciao,
avevo fatto questo per vedere lo stato dei segnali, è semplicissimo modificarlo per leggere e scrivere dalla porta:

import gnu.io.*;
public class SerialTest {
   public static void main(String[] args) {
       try {
           //String portName = "/dev/cu.SLAB_USBtoUART";
           String portName = "/dev/tty.SLAB_USBtoUART";
           //String portName = "/dev/tty.usbserial";
           //String portName = "COM6";
           System.out.println("Opening serial port " + portName);
           CommPortIdentifier portid = CommPortIdentifier.getPortIdentifier(portName);
           SerialPort serialPort = (SerialPort)portid.open("Serialport DTR/RTS test", 1000);
           
           serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
           serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
           //serialPort.disableReceiveTimeout();
           for (int i=0 ; i<5 ; i++) {
               System.out.println("DTR ON");
               serialPort.setDTR(true);
               Thread.sleep(10000);
               
               System.out.println("DTR OFF");
               serialPort.setDTR(false);
               Thread.sleep(10000);
               
               System.out.println("RTS ON");
               serialPort.setRTS(true);
               Thread.sleep(10000);
               
               System.out.println("RTS OFF");
               serialPort.setRTS(false);
               Thread.sleep(10000);
           }
       } catch (Exception e) {
           e.printStackTrace();
           System.exit(1);
       }
       System.exit(0);
   }
}

questa è la versione con jssc

import jssc.SerialPort;
import jssc.SerialPortException;

public class SerialTest2 {
   public static void main(String[] args) {
       try {
           //String portName = "/dev/cu.SLAB_USBtoUART";
           //String portName = "/dev/tty.SLAB_USBtoUART";
           String portName = "COM7";
           //String portName = "/dev/tty.usbserial";
           //String portName = "COM6";
           System.out.println("Opening serial port " + portName);
           //CommPortIdentifier portid = CommPortIdentifier.getPortIdentifier(portName);
           //SerialPort serialPort = (SerialPort)portid.open("Serialport DTR/RTS test", 1000);
           SerialPort serialPort = new SerialPort(portName);
           try {
               serialPort.openPort();
               serialPort.setParams(SerialPort.BAUDRATE_9600, 
                                SerialPort.DATABITS_8,
                                SerialPort.STOPBITS_1,
                                SerialPort.PARITY_NONE);
                //serialPort.closePort();//Close serial port
           //int mask = SerialPort.MASK_RXCHAR + SerialPort.MASK_CTS + SerialPort.MASK_DSR;//Prepare mask
           //serialPort.setEventsMask(mask);


           //serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
           //serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN);
           //serialPort.disableReceiveTimeout();
           serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
           //serialPort.notifyOnCTS(true);
           Boolean CTS = serialPort.isCTS();
           System.out.print("CTS is: ");
           if (CTS) {
                 System.out.println("True");
           } else {
                 System.out.println("False");
           }
           
           //serialPort.notifyOnDSR(true);
           Boolean DSR = serialPort.isDSR();
           System.out.print("DSR is: ");
           if (DSR) {
                 System.out.println("True");
           } else {
                 System.out.println("False");
           }
           Boolean RI = serialPort.isRING();
           System.out.print("RI is: ");
           if (RI) {
                 System.out.println("True");
           } else {
                 System.out.println("False");
           }
           
           while (true) {
                 Thread.sleep(500);
                 Boolean myCTS = serialPort.isCTS();
                 //if ( myCTS != CTS) {
                     if (myCTS == true ) {
                         System.out.println("CTS is: True");
                         CTS = true;
                     } else {
                         System.out.println("CTS is: False");
                         CTS = false;
                     }
                 //}
                 
                 Boolean myDSR = serialPort.isDSR();
                 if ( myDSR != DSR) {
                     if (myDSR == true ) {
                         System.out.println("DSR is: True");
                         DSR = true;
                     } else {
                         System.out.println("DSR is: False");
                         DSR = false;
                     }
                 }
                 Boolean myRI = serialPort.isRING();
                 if ( myRI != RI) {
                     if (myRI == true ) {
                         System.out.println("RI is: True");
                         RI = true;
                     } else {
                         System.out.println("RI is: False");
                         RI = false;
                     }
                 }

           }
                           }
            catch (SerialPortException ex) {
                            System.out.println(ex);
            }
       } catch (Exception e) {
           e.printStackTrace();
           System.exit(1);
       }
       System.exit(0);
   }
}

Grazie mille a tutti per le risposte!!!! :)

Ci siamo quasi... ho utilizzato:

bigjohnson: questa è la versione con jssc

import jssc.SerialPort;
import jssc.SerialPortException;

public class SerialTest2 {   public static void main(String[] args) {       try {           //String portName = "/dev/cu.SLAB_USBtoUART";           //String portName = "/dev/tty.SLAB_USBtoUART";           String portName = "COM7";           //String portName = "/dev/tty.usbserial";           //String portName = "COM6";           System.out.println("Opening serial port " + portName);           //CommPortIdentifier portid = CommPortIdentifier.getPortIdentifier(portName);           //SerialPort serialPort = (SerialPort)portid.open("Serialport DTR/RTS test", 1000);           SerialPort serialPort = new SerialPort(portName);           try {               serialPort.openPort();               serialPort.setParams(SerialPort.BAUDRATE_9600,                                SerialPort.DATABITS_8,                                SerialPort.STOPBITS_1,                                SerialPort.PARITY_NONE);                //serialPort.closePort();//Close serial port           //int mask = SerialPort.MASK_RXCHAR + SerialPort.MASK_CTS + SerialPort.MASK_DSR;//Prepare mask           //serialPort.setEventsMask(mask);

          //serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);           //serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN);           //serialPort.disableReceiveTimeout();           serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);           //serialPort.notifyOnCTS(true);           Boolean CTS = serialPort.isCTS();           System.out.print("CTS is: ");           if (CTS) {                 System.out.println("True");           } else {                 System.out.println("False");           }                     //serialPort.notifyOnDSR(true);           Boolean DSR = serialPort.isDSR();           System.out.print("DSR is: ");           if (DSR) {                 System.out.println("True");           } else {                 System.out.println("False");           }           Boolean RI = serialPort.isRING();           System.out.print("RI is: ");           if (RI) {                 System.out.println("True");           } else {                 System.out.println("False");           }                     while (true) {                 Thread.sleep(500);                 Boolean myCTS = serialPort.isCTS();                 //if ( myCTS != CTS) {                     if (myCTS == true ) {                         System.out.println("CTS is: True");                         CTS = true;                     } else {                         System.out.println("CTS is: False");                         CTS = false;                     }                 //}                                 Boolean myDSR = serialPort.isDSR();                 if ( myDSR != DSR) {                     if (myDSR == true ) {                         System.out.println("DSR is: True");                         DSR = true;                     } else {                         System.out.println("DSR is: False");                         DSR = false;                     }                 }                 Boolean myRI = serialPort.isRING();                 if ( myRI != RI) {                     if (myRI == true ) {                         System.out.println("RI is: True");                         RI = true;                     } else {                         System.out.println("RI is: False");                         RI = false;                     }                 }

          }                           }            catch (SerialPortException ex) {                            System.out.println(ex);            }       } catch (Exception e) {           e.printStackTrace();           System.exit(1);       }       System.exit(0);   } }

e ho modificato la porta che utilizzo (/dev/ttyACM0)

           String portName = "/dev/ttyACM0";

ma sul terminale ottengo l'avviso che non ho i permessi per comunicare con la porta...

Opening serial port /dev/ttyACM0
jssc.SerialPortException: Port name - /dev/ttyACM0; Method name - openPort(); Exception type - Permission denied.

ps. se avvio da root funziona

Che sistema operativo utilizzi? Penso sia Linux, mi sa che devi aggiungere l'utente che usi al gruppo dialout, guarda i permessi del gruppo sulla porta facendo ls -l /dev/ttyACM0 e aggiugiti al gruppo proprietrio della porta, vedi http://www.maffucci.it/2012/01/26/impossibile-selezionare-la-serial-port-sullide-di-arduino/

Non per tutte le distribuzioni è "dialout", come riportato sulla guida linkata (che vale per Ubuntu e derivate). Su altre può cambiare, ad esempio su ArchLinux è uucp. Inoltre devi essere membro del gruppo lock per poter creare i file di lock relativi alle porte aperte da rxtx.

bigjohnson: Che sistema operativo utilizzi? Penso sia Linux, mi sa che devi aggiungere l'utente che usi al gruppo dialout, guarda i permessi del gruppo sulla porta facendo ls -l /dev/ttyACM0 e aggiugiti al gruppo proprietrio della porta, vedi http://www.maffucci.it/2012/01/26/impossibile-selezionare-la-serial-port-sullide-di-arduino/

Utilizzo GNU/Linux, nello specifico Fedora.

leo72: Non per tutte le distribuzioni è "dialout", come riportato sulla guida linkata (che vale per Ubuntu e derivate). Su altre può cambiare, ad esempio su ArchLinux è uucp. Inoltre devi essere membro del gruppo lock per poter creare i file di lock relativi alle porte aperte da rxtx.

esattamente cambiano da distro a distro, per ora finché si tratta di sole prove lancio l'eseguibile come root e il gioco è fatto :)

Tornando a Java.... basandomi su jssc ho un po modificato lo script sopra riportato in modo che si "prenda" in automatico la porta senza ogni volta andare ad editare il codice sorgente. Lo script sopra proposto mostra solo due parametri (true e false) a seconda che vi sia o meno la presenza di comunicazione sulla seriale... ma se io volessi stampare a video ciò che l'arduino sta scrivendo sulla seriale come posso fare?

allego di sguito il codice funzionante (nb. per farlo funzionare ovviamente è necessario importare la libreria jssc):

import java.util.Arrays;
import jssc.SerialPort;
import jssc.SerialPortList;
import jssc.SerialPortException;

public class Main {
   
    public static void main(String[] args) {
        
        //ricavo nome porta
        String[] portNames = SerialPortList.getPortNames();
        for (String portNameC : portNames) {
        String porta = Arrays.toString(portNames); 
        
        //la variabile porta potrebbe presentarsi come [/dev/ttyACM0] quindi rimuovo reventuali parentesi
            if (porta.contains("[")){
                  porta = porta.replace("[", "");
                    porta = porta.replace("]", "");
        
            }
        


            //apro la porta interessata e verifico la presenza (true) o assenza (false) di segnale
        
             try {
         
           System.out.println("Opening serial port " + porta);
           SerialPort serialPort = new SerialPort(porta);
           try {
               serialPort.openPort();
               serialPort.setParams(SerialPort.BAUDRATE_9600, 
                                SerialPort.DATABITS_8,
                                SerialPort.STOPBITS_1,
                                SerialPort.PARITY_NONE);
               
           serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);

           Boolean CTS = serialPort.isCTS();
           System.out.print("CTS is: ");
           if (CTS) {
                 System.out.println("True");
           } else {
                 System.out.println("False");
           }
           
           //serialPort.notifyOnDSR(true);
           Boolean DSR = serialPort.isDSR();
           System.out.print("DSR is: ");
           if (DSR) {
                 System.out.println("True");
           } else {
                 System.out.println("False");
           }
           Boolean RI = serialPort.isRING();
           System.out.print("RI is: ");
           if (RI) {
                 System.out.println("True");
           } else {
                 System.out.println("False");
           }
           
           while (true) {
                 Thread.sleep(500);
                 Boolean myCTS = serialPort.isCTS();
                 //if ( myCTS != CTS) {
                     if (myCTS == true ) {
                         System.out.println("CTS is: True");
                         CTS = true;
                     } else {
                         System.out.println("CTS is: False");
                         CTS = false;
                     }
                 //}
                 
                 Boolean myDSR = serialPort.isDSR();
                 if ( myDSR != DSR) {
                     if (myDSR == true ) {
                         System.out.println("DSR is: True");
                         DSR = true;
                     } else {
                         System.out.println("DSR is: False");
                         DSR = false;
                     }
                 }
                 Boolean myRI = serialPort.isRING();
                 if ( myRI != RI) {
                     if (myRI == true ) {
                         System.out.println("RI is: True");
                         RI = true;
                     } else {
                         System.out.println("RI is: False");
                         RI = false;
                     }
                 }

           }
                           }
            catch (SerialPortException ex) {
                            System.out.println(ex);
            }
       } catch (Exception e) {
           e.printStackTrace();
           System.exit(1);
       }
       System.exit(0);
            

    }

    }  
}

inoltre ho trovato questo https://code.google.com/p/java-simple-serial-connector/wiki/jSSC_examples ma non riesco ad unire le due cose...

passettino passettino....

sull'arduino 2 ho caricato questo stupidissimo sketch

void setup() {
   Serial.begin(9600);

  pinMode(0, OUTPUT);
}

void loop() {
Serial.println("ciaooo");
delay(1000);
}

basandomi su http://java-simple-serial-connector.googlecode.com/svn/trunk/additional_content/javadoc/0.8/jssc/SerialPort.html ho scritto in java:

import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import jssc.SerialPort;
import jssc.SerialPortList;
import jssc.SerialPortException;

public class Main {
   
    public static void main(String[] args) throws SerialPortException, UnsupportedEncodingException {
        
        //ricavo nome porta
        String[] portNames = SerialPortList.getPortNames();
        for (String portNameC : portNames) {
        String porta = Arrays.toString(portNames); 
         System.out.println(porta);
        //la variabile porta potrebbe presentarsi come [/dev/ttyACM0] quindi rimuovo reventuali parentesi
            if (porta.contains("[")){
                  porta = porta.replace("[", "");
                    porta = porta.replace("]", "");
        
            }
                 System.out.println(porta);



            //apro la porta interessata e verifico la presenza (true) o assenza (false) di segnale
        
            SerialPort serialPort = new SerialPort(porta);
            serialPort.openPort();
            String buffer = serialPort.readString();//Read 10 bytes from serial port
            System.out.println(buffer);
            serialPort.closePort();//Close serial port
        }
    }
}

l'output del mio programma java è una prima riga con la porta racchiusa tra parentesi quadre, una seconda riga con il nome della porta senza le parentesi quadre, e una terza riga che dovrebbe mostrare la stringa "ciaooo" ma in realtà mi restituisce "null"...

[/dev/ttyACM0]
/dev/ttyACM0
null

idee?

max95: per ora finché si tratta di sole prove lancio l'eseguibile come root e il gioco è fatto :)

Cosa da non fare, puoi fare dei danni number one... :sweat_smile: Che ti costa aggiungerti ai gruppi dialout e/o uucp (al lock dovresti già essere aggiunto per altre cose sul tuo sistema, ma nel caso aggiungiti anche a quello), dico io? :P

leo72:

max95: per ora finché si tratta di sole prove lancio l'eseguibile come root e il gioco è fatto :)

Cosa da non fare, puoi fare dei danni number one... :sweat_smile: Che ti costa aggiungerti ai gruppi dialout e/o uucp (al lock dovresti già essere aggiunto per altre cose sul tuo sistema, ma nel caso aggiungiti anche a quello), dico io? :P

bha, per leggere la seriale non so quanti danni si possano causare, comunque come hai detto te è buona cosa lanciarlo da utente, e quindi andare ad aggiustare la questione dei gruppi...

ora sono appena riuscito con il comando

            String buffer = serialPort.readString(10);

a leggere 10 caratteri sulla seriale, quindi l'output è

ciaooo
ci

in totale sono 8 caratteri, non 10 come indicato, e questo suppongo sia dovuto al fatto dei caratteri speciali quali quello per andare a capo...

quindi diciamo che ho raggiunto il mio obiettivo... però mi sorge un ultimo dubbio, se volessi leggere la seriale per righe, e ogni riga ha un numero diverso di caratteri, come posso gestire la cosa? (in altre parole, se volessi stampare solo la singola riga, ma non conosco la sua lunghezza, come posso fare?)

Per leggere tutti i caratteri disponibili usa readString() vedi http://java-simple-serial-connector.googlecode.com/svn/trunk/additional_content/javadoc/0.8/jssc/SerialPort.html se definisci un protocollo ci puoi mettere un fine riga standard tipo ; o puoi cercare il carattere di ritorno a capo. Quando lo trovi decodifichi il comado completo.

bigjohnson: Per leggere tutti i caratteri disponibili usa readString() vedi http://java-simple-serial-connector.googlecode.com/svn/trunk/additional_content/javadoc/0.8/jssc/SerialPort.html se definisci un protocollo ci puoi mettere un fine riga standard tipo ; o puoi cercare il carattere di ritorno a capo. Quando lo trovi decodifichi il comado completo.

come riportato sopra, il comando readString() mi restituisce "null"... per quello ho optato per il sistema dove indico in numero di caratteri....

inoltre ho notato un'altra cosa strana.... mettiamo che lo sketch dell'arduino mi scrive in seriale un testo lunghissimo composto da molti e molti Serial.println()..... benissimo, perchè invece quando avvio il programma Java mi stampa sempre e solo dall'inizio? come se l'arduino si resettasse nel momento in cui vado a leggere la seriale...

sketch arduino:

void setup() {
  Serial.begin(9600);
}

void loop() {

  Serial.println("aaaaa");delay(100);
  Serial.println("bbbbb");delay(100);
    Serial.println("ccccc");delay(100);
  Serial.println("ddddd");delay(100);
    Serial.println("eeeee");delay(100);
  Serial.println("fffff");  delay(100);
}

programma java:

import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import jssc.SerialPort;
import jssc.SerialPortList;
import jssc.SerialPortException;

public class Main {
   
    public static void main(String[] args) throws SerialPortException, UnsupportedEncodingException {
        
        //ricavo nome porta
        String[] portNames = SerialPortList.getPortNames();
        for (String portNameC : portNames) {
        String porta = Arrays.toString(portNames); 
         System.out.println(porta);
        //la variabile porta potrebbe presentarsi come [/dev/ttyACM0] quindi rimuovo reventuali parentesi
            if (porta.contains("[")){
                  porta = porta.replace("[", "");
                    porta = porta.replace("]", "");
        
            }
                 System.out.println(porta);



            //apro la porta interessata e verifico la presenza (true) o assenza (false) di segnale
        
            SerialPort serialPort = new SerialPort(porta);
            serialPort.openPort();
            String buffer = serialPort.readString(25);//Read 10 bytes from serial port
            
            System.out.println(buffer);
            serialPort.closePort();//Close serial port
        }
    }
}

output:

[/dev/ttyACM1]
/dev/ttyACM1
aaaaa
bbbbb
ccccc
dddd

inoltre ho notato che se abbasso i delay nello sketch sotto i 100 il programma java non rileva più le informazioni scritte su seriale...

scusate se riporto tutto, ma in questo modo questo topic potrà tornare utile a me e ad altri in futuro.... in rete si trova poco materiale (funzionante per arduino due) a riguardo

La differenza tra readString(10) e readString() penso sia che la prima si blocca e attende 10 caratteri poi prosegue, la seconda ritorna null se non ci sono caratteri e tutti i caratteri se ce ne sono, dovresti mettere una if e stampare la stringa solo se non è null

Per evitare il reset dell'arduino leva il controllo di flusso hardware, se no il pin DTR ti resetta l'arduino. Vedi Software settings to disable the DTR pin on the host: http://playground.arduino.cc/Main/DisablingAutoResetOnSerialConnection

bigjohnson: Per evitare il reset dell'arduino leva il controllo di flusso hardware, se no il pin DTR ti resetta l'arduino. Vedi Software settings to disable the DTR pin on the host: http://playground.arduino.cc/Main/DisablingAutoResetOnSerialConnection

ciao, grazie mille per i preziosi consigli

purtroppo il link/guida su come disabilitare la questione DTR non cita assolutamente arduino DUE.... possibile che per tale scheda (che è una bomba) non vi sia documentazione?? :(

Ho letto che la due ha due usb quella per programmare e un altra, prova ad usare la seconda per dialogare con il programma, sicuramente non si resetta.

Il chip SAM gestisce la porta USB in modo nativo, difatti per la programmazione hanno montato una seconda linea gestita dal 16U2. Come ti ha detto big-j quando devi dialogarci in modo "diverso" usa questa,

mmm... facciamo il punto della situazione:

sketch sull'arduino:

void setup() {
  Serial.begin(9600);
}

void loop() {

  Serial.println("aaaaa");delay(100);
  Serial.println("bbbbb");delay(100);
    Serial.println("ccccc");delay(100);
  Serial.println("ddddd");delay(100);
    Serial.println("eeeee");delay(100);
  Serial.println("fffff");  delay(100);
}

Programma java:

import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import jssc.SerialPort;
import jssc.SerialPortException;
import jssc.SerialPortList;

public class Main {

   
    public static void main(String[] args) throws SerialPortException, UnsupportedEncodingException {
       
        
        Boolean stato = false;
        
        String porta;
        
        //ricavo nome porta
        String[] portNames = SerialPortList.getPortNames();
        for (String portNameC : portNames) {
        porta = Arrays.toString(portNames); 
        
        //la variabile porta potrebbe presentarsi come [/dev/ttyACM0] quindi rimuovo reventuali parentesi
            if (porta.contains("[")){
                  porta = porta.replace("[", "");
                  porta = porta.replace("]", "");
        
            }
                 
            System.out.println("Stai lavorando sulla porta: " + porta);



            //apro comunicazione sulla porta interessata 
            SerialPort serialPort = new SerialPort(porta);
            serialPort.openPort();            
            
            //con il ciclo while verifico se nella porta ho "Null" o se ho una stringa.
            //Se ho una stringa la stampo a video.
            //in serialPort.readString() è possibile settare il numero di caratteri da leggere
            //ad esempio serialPort.readString(100)
            
            while(!stato){
                 String buffer = serialPort.readString();//Read 10 bytes from serial port
                 if(buffer==null){stato=false;}
                 if(buffer!=null){stato=true;System.out.println(buffer); }
                 
            }
            
            
            //chiudo comunicazione sulla porta
            serialPort.closePort();
            }
        }
    }

Allora, se io mi connetto alla programming port ho come output:

Stai lavorando sulla porta: /dev/ttyACM0
aaaaa

e il programma esce correttamente.

se mi connetto alla native port usb invece:

Stai lavorando sulla porta: /dev/ttyACM0

e non giunge al termine (pin tx rx dell'arduino nn lampeggiano nemmeno) e devo forzare l'uscita.

dalla pagina http://playground.arduino.cc/Main/DisablingAutoResetOnSerialConnection ho letto che posso disabilitare il DTR direttamente da linux con

stty -F /dev/usbTTY0 -hupcl

(mettendo la porta corretta), ma ovviamente sulla mia distro (Fedora) non sembra funnzionare.

se modifico il programma java invece, cambiando la riga 45 da

                 if(buffer!=null){stato=true;System.out.println(buffer); }

a

                 if(buffer!=null){stato=false;System.out.println(buffer); }

vado a creare un ciclo infinito di lettura e in tal caso l'output è:

Stai lavorando sulla porta: /dev/ttyACM0
aaaaa



bbbbb


ccccc


ddddd



eeeee


fffff


aaaaa


bbbbb


ccccc



ddddd


eeeee


fffff



aaaaa


bbbbb


ccccc



ddddd

fino a quando non forzo l'arresto del programma. In tal caso, perchè vengono stampate tutte quelle righe vuote?

Qui male

 while(!stato){
                 String buffer = serialPort.readString();//Read 10 bytes from serial port
                 if(buffer==null){stato=false;}
                 if(buffer!=null){stato=true;System.out.println(buffer); }
                 
            }

meglio

String buffer;
while(true){
        String buffer = serialPort.readString();
        if (buffer!=null) //bisogna vedere cosa restituisce quando non ci sono caratteri
        {System.out.println(buffer); }

non ho provato il codice!
nello sketch arduiniano per usare l’altra porta devi scrivere

void setup() {
  Serial1.begin(9600);
}

void loop() {
 
  Serial1.println("aaaaa");delay(100);
  Serial1.println("bbbbb");delay(100);
    Serial1.println("ccccc");delay(100);
  Serial1.println("ddddd");delay(100);
    Serial1.println("eeeee");delay(100);
  Serial1.println("fffff");  delay(100);
}

così usi l’altra seriale non quella di programmazione se non va prova con 2 3 dopo il Serial
Ho letto la documentazione della Due ma qualcosa non va.