Go Down

Topic: problema con RXTX e Java(Eclipse) (Read 735 times) previous topic - next topic

Tr3nT

ho un piccolo programma sull'Arduino che mi legge dei caratteri dalla seriale, li elabora e pi me li rispedisce al PC.
Dal PC ho un applicazione Java che utilizza RXTX per comunicare con l'Arduino.
Questo è più o meno il codice dell'applicazione java(scusate la formattazione orribile)
Code: [Select]

CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier("/dev/ttyUSB2");
// open serial port, and use class name for the appName.
serialPort = (SerialPort) portId.open("prova",TIME_OUT);

// set port parameters
serialPort.setSerialPortParams(DATA_RATE,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);

// open the streams
input = serialPort.getInputStream();
output = serialPort.getOutputStream();
//Send the SYNC String
   
    byte[] asd= {0x5A,0x31,(byte) (0x5A+0x31)};
    output.write(asd);
    output.close();
    String str =new String("");
    boolean read=false;
    long time = System.currentTimeMillis();
    while(!read ){
    if(System.currentTimeMillis()-time>=5000){
    read=true;
    JOptionPane.showMessageDialog(frame.form, "response timeout");
    }
    Character c;
if(input.available()>0){
c = (char)input.read();

    if(c.charValue()!=13&&c.charValue()!=10)
    {
    if(c!=-1&&c<255){
    str=str.concat(c.toString());
   
    }
    }
    else{
    read=true;
    JOptionPane.showMessageDialog(frame.form, "this:"+str);
    if(firstTime){
    frame.form.add(frame.scrollPane);
    frame.form.validate();
    firstTime=false;
    }
    for(int i=0;i<frame.table.getRowCount();i++){
    frame.table.removeRow(i);
    }
    String[] values = str.split("\\|");
    for(int i=0;i<values.length;i++){
    JOptionPane.showMessageDialog(frame.form, values[i]);
}
    //frame.table.addRow(new Object[]{"b","b","b","b"});
    frame.table.fireTableRowsInserted(0, 2);
            }
    }
   }
    input.close();
    serialPort.close();


L'ultima parte fa solo cose accessorie.
Comunque appena viene chiamato questo metodo accade che per un attimo il led RX si accende(e qui tutto ok) ma subito dopo si accende anche il L(che contraddistingue il fatto che l'Arduino si resetti) e quindi il programma mi va in timeout.
Dove sta l'errore? c'è qualcosa che mi sono dimenticato?
Ho letto in un altro topic di aggiungere un delay elevato prima di fare serial.begin() per fare in modo che il programma stia in ascolto, ma allora come funziona il serial monitor? devo stare costantemente in ascolto?

Una cosa che ho notato: se nel mio codice metto che ad ogni ciclo scrivo qualcosa sulla seriale allora il codice funziona parzialmente nel senso che riesco a leggere ciò che mi manda l'arduino, che però appena ha ricevuto i miei dati da PC comunque si resetta(si accende il led L).
Avete avuto anche voi problemi simili? come avete risolto?

bigjohnson

#1
Apr 05, 2012, 03:47 pm Last Edit: Apr 05, 2012, 03:51 pm by bigjohnson Reason: 1
Nel tuo codice non vedo la gestione del segnale dtr della seriale, se trasmetti sulla seriale e non lo gestisci correttamente l'arduino si resetta, per info leggi qui
http://www.arduino.cc/playground/Learning/AutoResetRetrofit
ma forse è meglio qui
http://arduino.cc/playground/Main/DisablingAutoResetOnSerialConnection
Con i terminali classici, hiperterm, putty, teraterm non ci sono problemi perché il segnale lo gestiscono loro, se ti scrivi il programma lo devi impostare tu.

Alberto

Tr3nT

uhm...ho capito che procedimento è spiegato..infatti è lo stesso utilizzato per utilizzare l'arduino come programmatore...
un jumper sarebbe l'ideale comunque...:D
Anche l'Arduino IDE se si apre il serial monitor da lo stesso problema?neanche loro ci hanno pensato?

aspettando 5-6 secondi si risolve tutto e l'arduino non i resetta finchè lo chiudo.
comunque con l'RXTX sembra non esserci soluzione(software) o ho letto male?

bigjohnson

Con il serial monitor di arduino non ci sono problemi, non dovrebbe resettare l'arduino, prova a cambiare lo stato del dtr prima di inviare i caratteri, deve funzionare, per esempio il serial monitor di arduino quando apri la porta seriale non lo resetta, ho provato anche altri emulatori di terminale e non ho mai avuto problemi.
Se aspetti e non invii caratteri il boot loader non parte e si avvia l'applicazione, ma questo non è corretto l'arduino non si deve resettare.
Hai letto questo?
http://arduino.cc/playground/Interfacing/Java

Tr3nT

Boh...con il mio arduino noto che premendo su "Tools" dell'IDE si resetta l'Arduino e per un paio di secondi non risponde(aprendo velocemente il serial monitor)
con rxtx ho trovato il parametro setDTR e ho risolto parzialmente, riducendo a 1,5-2 secondi il tempo di risposta dell'arduino, ma non sono riuscito a non farlo resettare(anche nella guida per interfacciarlo parla di un tempo di sleep del thread di almeno 1500 ms)

leo72


Con il serial monitor di arduino non ci sono problemi, non dovrebbe resettare l'arduino

L'apertura del serial monito di Arduino resetta la scheda eccome.


Boh...con il mio arduino noto che premendo su "Tools" dell'IDE si resetta l'Arduino

Anche questo è "normale", perché l'IDE fa una scansione delle porte per vedere se trova un Arduino collegato ad una di esse per cui l'apertura della comunicazione seriale, si sa, da il reset all'Arduino gli Arduino sono progettati per comportarsi così. Se volete togliere questo "difetto" dovete interrompere il jumper di stagno "RESET-EN" che c'è sulla schedina, ma poi non potete più programmare l'Arduino dall'IDE senza premere a mano il tastino reset.

Delle 2, l'una: scegliete quella che più vi piace.  ;)
Reset all'apertura della seriale -> programmazione senza pressione del pulsante
Eliminazione del reset all'apertura della seriale -> programmazione con pressione del pulsante di reset

NamroN

Ciao a tutti,
premetto che ho una arduino uno in arrivo...
ma poiche sono intressato alla comunicazione seriale ho già letto alcuni post...
Guardate questo link:

http://electronics.stackexchange.com/questions/24743/arduino-resetting-while-reconnecting-the-serial-terminal

Connettre un condensatore da 22microF tra il Reset e GND per non far autoresettare la scheda..toglierlo per programmarla...

di certo soluzione molto più comoda che permette di mantenere la garanzia.
Fate sapere se funziona...

Go Up