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?
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é?
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?
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.
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.
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.