NullPointerException processing serial arduino

Ciao ragazzi, nuovo problema :slight_smile:

Non sono molto pratico di processing, comunque sto cercando di inviare interi da seriale da arduino a processing e poi da processing ad arduino.

Il problema avviene nel codice processing, quando ricevuta la stringa e suddivisa in base alle virgole dentro l'array data ottengo l'errore NullPointerException.

if(port.available() > 0)
      {
        msg = port.readStringUntil('E');
      }
      
        if (msg != null) 
        {  
          // lettura 
          String[] data = msg.split(",");      // suddivide il msg in base alle virgole
          
            
            for (i=0;i<data.length-1;i++)
            {
              valore_letto[i]=Integer.parseInt(data[i]);   //l'errore compare qui!!!!!!!!!!!!!!!!!!!!
             println("Valore letto"+i+"="+valore_letto[i]);
               
            }
           
        }

Mando dieci valori interi con arduino e li ricevo bene, solo che quando poi li devo mettere in valore_letto mi da l'errore. questo array è definito così: int[] valore_letto;
Come risolvere?
Grazie a tutti

un suggerimento su come scoprire errori nel codice.
Siccome sai qual'e' la linea di codice incriminata, e nella riga hai una assegnazione, perciò un elemento a sinistra che riceve e uno a destra che scrive, prova a "spezzare" quella riga usando una variabile int al posto.

for (i=0;i<data.length-1;i++)
{ int x;
  x=Integer.parseInt(data[i]);   //l'errore compare qui!!!!!!!!!!!!!!!!!!!!
  valore_letto[i]=x;
  println("Valore letto " + i + "=" + valore_letto[i]);
}

se l'errore è ancora su quella linea, allora data non contiene quello che ti aspetti, perciò prova a farne un prinln
se l'errore è sulla linea successiva, probabilmente hai dichiarato male valore_letto.

Assicurati anche che data[] contenga qualcosa... NullPointerException significa che il puntatore non sta "puntando" a nulla.
Voglio dire, sei sicuro che lo split sia stato eseguito correttamente, mettendo i dati in quell'array?

Ho risolto, era l'array valore_letto che era dichiarato in un modo che non gli piaceva ]:slight_smile:

Ho un altro problema, devo inviare una stringa composta da processing ad arduino, composta così: 500,400,300,200,100,1,2,3,4,5,E

arduino legge ogni carattere e lo mette in un array di caratteri

if(writing) // ricevo dati da processing 
    {
      char readChar=Serial.read();
      if(readChar=='E') {writing=false;}
      else
      {  
        readString[i]=readChar;
        i++;
      }      
    }

Come faccio a ricavare il numero corrispondente e salvarlo in un array di interi?

ekjk:
Come faccio a ricavare il numero corrispondente e salvarlo in un array di interi?

Il numero corrispondente di cosa?

String s="123";
char buf[4];
s.toCharArray(buf, 4);
int x=atoi(buf);
Serial.println(s+1);
Serial.println(x+1);

oppure usi direttamente atoi() se usi già un array di char,
MA i caratteri devono terminare con il carattere di fine stringa '\0'

edit by mod: per favore includere il codice usando gli appositi tag

Io li metto già in un array di chat.
Praticamente arriva il primo numero e lo metto in posizione 0, poi arriva il secondo e così via
Fino a che non arriva la virgola che riconosco e so che così la sequenza di numeri è finita.
Quindi al posto della virgola inserisci il terminatore e poi faccio atomi di tale array. Ma non funziona. NB dopo atomi devo salvare il numero in EEPROM. Quando vado a leggerla leggo degli zeri.... Perché?

Sempre, dico, sempre postare il codice. Sennò che facciamo? Ti leggiamo nel pensiero ? :grin:

detto fatto

:wink:

if(writing) // ricevo dati da processing e li metto in eprom
    {   
      if(val=='E') {writing=false;}
      else
      { i++;
        readString[i-1]=val;
        
        if(val==',')
        {  
          readString[i-1]='\0';
          delta_t[k]=atoi(readString);
          EEPROM.write(k,delta_t[k]);//digitalWrite(13,1);
          k++;i=0;
        }
        
      }      
    }

readString è un array di 5 char

Fai sempre un passo alla volta, prima di mettere 18 cose insieme. :grin:

delta_t[k]=atoi(readString);

fa invece:

int x=atoi(readString);
Serial.println(x);
delta_t[k]=x;

così puoi verificare da te se la conversione funziona.

il problema è che quando invio i dati da processing e arduino li riceve non posso aprire il serial monitor per vedere il dato ricevuto o la conversione.
Sono sicuro che atoi() funziona perchè l'ho provata prima in uno sketch a parte.

Ti ringrazio per le risposte, mi consigli quindi di fare un passo alla volta, cioè prima salvo l'int in x e poi lo metto in un array?

Spezzare in più passi utile ma solo se puoi fare debug, ovvero in qualche modo puoi "stampare" i valori tipo Serial.print.

Ora come ora non riesco a printare a video perchè il canale è occupato da processing.

Comunque, se in processing faccio: port.write(10); e subito dopo port.write(',');

e su arduino leggo come nel codice che ho messo, l'array readString[0]={10} e readString[1]={,} giusto?

C'è nessuno?

ekjk:
C'è nessuno?

Che c'è? :stuck_out_tongue:

Se è per questo problema:

ekjk:
Ora come ora non riesco a printare a video perchè il canale è occupato da processing.

Ti sei risposto da solo:

ekjk:
il problema è che quando invio i dati da processing e arduino li riceve non posso aprire il serial monitor per vedere il dato ricevuto o la conversione.

La seriale può essere gestita solo da 1 ascoltatore per volta.

Leggi sopra.

Volevo sapere se le due righe che ho scritto vanno bene.
Da processing scrivo prima il valore 10 e poi una virgola, che controllo devo fare in arduino a parte Serial.avaiable()?

metto i caratteri in un array di char e quindi in posizione 0 avrò 10 e in posizione 1 avrò , giusto?

Sulla seriale viaggiano informazioni scomposte in singoli byte.
Se da Processing (che non uso) spedisci "10" arriveranno i byte "1" e "0", quindi in posizione 0 ci sarà "1" ed in posizione 1 ci sarà "0". Che poi corrisponderebbero ai valori decimali 49 e 48.

Mi è poco chiara la cosa. perchè io da arduino mando valori interi con serial.print(x) dove x è int x=100 per esempio.
Su processing leggo 100, non leggo il byte "100".

Quindi perchè al contrario non funziona?

Comunque se guardi il mio codice faccio una verifica su readString[5] di questo tipo:

controllo il carattere ricevuto e se è la vrigola allora metto nella stessa posizione il terminatore '\0' e così ho che la stringa conterrà
[0]='1',[1]='0',[2]='\0' [3]=boh [4]=boh

dopo di che faccio una atoi(readString) e lo metto in una locazione di array di int.

Sbaglio qualcosa?

Se scrivi un numero, esso viaggia come byte (o insieme di byte).
Se Processing è come Arduino, Serial.print(100) trasmette un singolo byte con valore 100, se scrivi Serial.print("100") vengono trasmessi 3 byte, "1", "0" e "0" oppure 49, 48 e 48.

Forse dovrei fare un controllo anche del tipo se ho ricevuto un numero allora lo metto nell array altrimenti no.

Se faccio in arduino val=Serial.read();

if(val>='0' && val<='9') readString[i]=val;

Faccio una verifica se ricevo un carattere da 0 a 9 no?

poi facendo un atoi sull'array me lo converte in intero.

Grazie dell'aiuto