Non riguarda processing il topic in quanto credo che l'errore sia dal lato Arduino. Potete dirmi perché media mi viene uguale a 0?
CODICE PROCESSING
import processing.serial.*;
int[] A = {1,2,3,4,5,6,7,8,9}; // crea un vettore di 9 elementi
int[] B = {10, 11, 12, 13, 14, 15, 16 ,17 ,18 ,19}; // crea un vettore di 10 elementi
Serial porta; // crea un oggetto della classe seriale
int i;
boolean calcola = false;
void setup()
{
size(400,400);
String portName = Serial.list()[1];
porta = new Serial(this, portName, 9600);
}
void draw()
{
if (calcola) {
if(porta.available() > 0) {
int media = porta.read();
println("La media è " + media);
}
}
}
void keyPressed()
{
/* Invia ad Arduino i due vettori. */
if (key == ' ') {
for (i=0; i<9; i++) {
porta.write(A[i]);
delay(100);
}
for (i=0; i<10; i++) {
porta.write(B[i]);
delay(100);
}
}
calcola = true;
}
CODICE ARDUINO
#include <SoftwareSerial.h>
int A[9]; // crea un array vuoto di 9 elementi
int B[10]; // crea un array vuoto di 10 elementi
int i;
int sommaA = 0;
int sommaB = 0;
int media = 0;
void setup() {
Serial.begin(9600); // inizializza la comunicazione seriale a 9600 bps
}
void loop() {
if (Serial.available()) {
for (i=0; i<9; i++) {
A[i] = Serial.read();
}
for (i=0; i<10; i++) {
B[i] = Serial.read();
}
}
for (i=0; i<9; i++) {
sommaA = sommaA + A[i];
}
for (i=0; i<10; i++) {
sommaB = sommaB + B[i];
}
media = (sommaA + sommaB)/2;
Serial.write(media);
}
non credo sia motivo di errore, ma lato processing entrambi i for di invio arrivano a 9.
lato arduino... sei sicuro che basti un solo seral.available per ricevere tutti i valori?
prova a verificare che valori hai negli array dopo aver ricevuto i dati.
curiosità... ma che media dovresti avere con quell'operazione?
fratt:
non credo sia motivo di errore, ma lato processing entrambi i for di invio arrivano a 9.
lato arduino... sei sicuro che basti un solo seral.available per ricevere tutti i valori?
prova a verificare che valori hai negli array dopo aver ricevuto i dati.
curiosità... ma che media dovresti avere con quell'operazione?
Ho modificato il for, ora il secondo arriva a 10 come dovrebbe. Ho provato ora a mettere un led che si accende se A[1] = 1 ma non si accende.. quindi che intendi che basti un solo serial.available? Cosa dovrei fare?
un byte è semplicemente un "piccolo" int... il byte può contenere valori tra 0 e 255... se ti basta questo range non devi convertire niente. se ti servono valori più grandi la cosa si complica un pochino.
ciao...si risolve utilizzando una verifica dei bytes arrivati tramite la Serial.readByte(myArray,lenght)...del flusso dati decidi quanti dedicarne all'array A e B...
In Processing hai messo delle dalay(100) tra un invio e l'altro per ogni elemento. E' un tempo enorme per una macchina elettronica
Lato Arduino magari ricevi il primo e quindi Serial.available() è okay
Ma poi nel for leggi senza sosta con Serial.read() ma... potrebbero non esserci ancora i dati successivi.
La serial.Read() ritorna -1 se non ci sono dati.
for (i=0; i<9; i++)
{ A[i] = Serial.read();
}
Conviene fare il i++ solo se la read non ha letto -1 (occhio che la Serial.read() ritorna un int, non byte)
for (i=0; i<9; )
{ int c=Serial.read();
if( c > -1)
{ A[i] = c;
i++;
}
}
P.S. leva quelle ennemila righe vuote, non servono a nulla, non è un tema che più è lungo è chiù bello è !!
nid69ita:
(occhio che la Serial.read() ritorna un int, non byte)
in effetti avevo letto male il reference e ho sparato una minchiata... però una cosa non mi è chiara... il reference dice: Returns the first byte of incoming serial data available (or -1 if no data is available) - int
significa che restituisce solo il primo byte disponibile malo restituisce come int?
La serial.read() ritorna un valore int per permettere di capire se si è realmente letto un byte dal buffer della seriale oppure no.
Se ricevi un valore compreso tra 0 e 255 (0x00 - 0xff) sicuramente hai un byte letto dal buffer, se ricevi -1 come valore intero, ovvero 0xffff, sicuramente non è stato letto nessun letto nessun dato dal buffer della seriale.
astrobeed:
La serial.read() ritorna un valore int per permettere di capire se si è realmente letto un byte un byte dal buffer della seriale oppure no.
Se ricevi un valore compreso tra 0 e 255 (0x00 - 0xff) sicuramente hai un byte letto dal buffer, se ricevi -1 come valore intero, ovvero 0xffff, sicuramente non è stato letto nessun letto nessun dato dal buffer della seriale.