Invio Ricezione esempio Test02

Ci sto lavorando

 

 

Oggetto: Problematiche inerenti l'invio/ricezione dati tra Arduino e Pc

 

Facciamo un piccolo passo in avanti. In questo progetto raddoppiamo gli slider ed aggiungiamo un impostazione iniziale dei parametri. Il primo slider servirà per impostare dei valori minimi mentre il secondo i valori massimi. I valori iniziali sono visualizzati all'apertura sugli slider ma in realtà non hanno una corrispondenza su Arduino. Dovremo fare in modo che all'apertura i valori iniziali degli slider vengano inviati ad Arduino per impostarli a quei valori in modo che ci sia una perfetta sincronizzazione. Mentre il codice di Arduino rimane lo stesso sul Pc bisogna fare delle aggiunte e modifiche. Rispetto all'esempio precedente abbiamo aggiunto uno slider ed una label in più.

Ma la particolarità sta nella routin che aggiarna ai valori iniziali Arduino

 

153 private void inizializzaParametri(){        
154         ihm=640; ihx=2400;
155        
156         tflg=1;
157         tm = new Timer(100,new ActionListener() {           
158             @Override
159             public void actionPerformed(ActionEvent evt) {
160                 try{
161                     if(tflg==1){
162                         shm="hm"+ihm+"\r\n";
163                         serialPort.writeString(shm);
164                         tflg=2;
165                     }else if (tflg==2) {
166                         shx="hx"+ihx+"\r\n";
167                         serialPort.writeString(shx);
168                          tm.stop();
169                     }               
170                 }catch (SerialPortException ex) {
171                     System.out.println(ex);
172                 }
173             }    
174         });
175         tm.start();    
176     }         

 

Vi chiederete ma perchè questa temporizzazione? Non si poteva fare direttamente così?

 

153 private void inizializzaParametri(){        
154         ihm=640; ihx=2400;             
155         try{               
156             shm="hm"+ihm+"\r\n";
157             serialPort.writeString(shm);
158             shx="hx"+ihx+"\r\n";
159             serialPort.writeString(shx);                                             
160         }catch (SerialPortException ex) {
161             System.out.println(ex);
162         }
163     }     

 

Piu semplice più pulito!?

Guardate i due risultati:

Primo codice:

 

Secondo codice:

 

Come si può notare con il primo codice entrambe i valori iniziali sono stati spedit ad Arduino ne sono conferma i messaggi di ritorno. Invece con il secondo codice è stato spedito solo il primo. Come mai? Evidentemente sparando uno di seguito all'altro i due valori, Arduino non ha il tempo materiale per processarli e processa solo il primo. Sta di fatto che mandando i dati uno dopo l'altro separati da 100  millisecondi di intervallo i messaggi mi ritornano regolarmente.

Aumentato il numero di slide a 4 ed eseguite delle prove:

Variando l'intervallo in millisecondi del timer ed osservando il comportamento ne è risultato che a 1ms ne fa uno, a 10ms ne fa 2 incrociando i dati, ossia ne invia 3 ne riceve 2. Va progresivamente migliorando man mano che si aumenta l'intervallo. Si regolarizza a circa 100 ms. Quindi è assodato che è un problema di tempo di processamento necessario.

Altra osservazione da fare che in questo caso, lato Arduino, non bisogna assolutamente svuotare il buffer altrimenti si perdono dati.