Operazioni Array su Arduino

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?

non uso spesso la seriale, quindi non sono molto pratico...

  1. usi il serial.available per vedere se ci sono dati disponibili, ma sei sicuro che ce ne siano a sufficienza per riempire entrambi gli array?

  2. dal reference vedo che serial.read restituisce un byte... mentre lato processing hai dichiarato gli array come int... può dipendere da quello?

sto sparando a occhio... ma potrebbe dipendere anche da quello...

come posso convertire poi l'array di byte in un array di int, se è come dici tu?

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.

no mi basta quel range... però non funziona nemmeno se dichiaro tutto in byte...

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

Verifichi a lato Arduino che arriva almeno 1 Byte sulla seriale e poi leggi 19 byte.
In pratica ricevi solo il primo byte e basta.
Ciao Uwe

Quindi come potrei modificare il mio codice per farlo funzionare?

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 è !!

Si questo l'ho capito.. ma come potrei fare per risolvere questo problema?

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.

NicholasASR:
Si questo l'ho capito.. ma come potrei fare per risolvere questo problema?

Ti ho postato il codice del for. Cosa non hai capito ?

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.

grazie... non ci ero arrivato.