dumb post about serial.read

ciao a tutti
eccomi con uno stupido post sulla lettura da seriale
le cose vanno abbastanza bene (mando la stringa “ab” da processing e ricevo su arduino)

però
se in processing cambio il framerate O se metto dei delay in arduino
la situazione si ingarbuglia un po’

nel senso che mentre con “codicepulito” ho questo output su serial monitor :
[result]
Ok i recrecived: ab
Ok Ok i recived: ab ab
Ok i recivived: ab
Ok i i recived: ab
b
Ok i recived:ed: ab
Ok i rerecived: ab
OkOk i recived: a: ab
Ok i recivcived: ab
Ok i i recived: ab
b
Ok i recivedved: ab
Ok i re recived: ab
Ok
Ok i recived: : ab
Ok i reciecived: ab
Ok ik i recived: ab
ab
Ok i reciveved: ab
Ok i r recived: ab
Ok i recived: d: ab
Ok i rececived: ab
[/result]
che va abbastanza bene

se metto delay o cambio framerate mi succedono cosecosì:
[result]
Ok i rOk i recive i recived: ba
cived: ba
: ba
Ok
Ok i recived: ba?Ok i recived: ab
ecived: ab
k i recived: abOk i recivedOircvd Ok i recivO rcvdOk i recOk iOk i rOkOi eivd b
k i recived: abOk i reciveOircvdOk i recOk OiOircvd Ok i recivOircvdOk i reOk Oirie:a
O
i recived: ab
Oi eie:aOk i reciveOk i eie:Ok i recOk iO Oircvd b
d: ab
Ok i reciveOk i reOk O eivd b
k i recived: ab
Ok Ok i recied b
d: ab
Oircvd b
ved: ab
Oircvdab
ecived: ab
i recived: ab
Ok Oircvd:Ok i reciOk iO eivd a
O
i recived: ab
O eie:aOk i reciveOirivd
O eved: ab
OireieOk i reOk Ok recived: ab
Oircvd bO rcvOi ecvd b
Ok i reOk
recived: ab
Oi eie:b
d: ab
Ok i recivedOk i recOircvOk i rOkO iO
d: ab
OircvdOk i reOk OiOi eie:ab
ed: ab
Ok i recivedOk i reOk Oiried b
k i recived: ab
Ok Ok i recived: aOk i reciveOi eie:Ok i recOk iO eie:a
O eie:aOk i reciveOircvd b
cived: ab
i recived: ab
[/result]
che è un po’ meno ok…

cosa vuol dire?
spero di non aver postato una banalità…

ps, il codice, che, senza dirlo, è una banalità mostruosa degna nemmeno di un esempio…

//processing

import processing.serial.*;

Serial port;
void setup() {
    port = new Serial(this,Serial.list()[0], 9600);
   // frameRate(25);
}


void draw() {
  //int b = 5;
  port.write("ab");
}
//arduino
int incomingByte = 0;      
int pointer = 0;
char buffer[8];


void setup() {
      Serial.begin(9600);
}

void loop() {

        int i=0;
  
      if (Serial.available() > 2) {

                for (i=0;i<2;i++) {
                incomingByte = Serial.read();

                    buffer[i]=incomingByte;

                }
                Serial.print("Ok i recived: ");
                Serial.println(buffer);
      }
//delay(10);

}

altra stranezza..

da processing: port.write("ab")

se nel codice arduino dichiaro il buffer come char buffer[3] leggo ab

se lo chiachito come puntatore char *buffer leggo £b

non dovrebbe essere più corretto dichiarare un puntatore? :-/

Un array e' gia un puntatore!

si, ma allora perchè quella differenza?

se scrivo char buffer[3] o char *buffer in teoria dovrebbe cambiare poco no?

e poi.. nessuno sa perchè quelle differenze di output da serial monitor se metto i delay o cambio i framerate??

Se tu dichiari char buffer[3] dici al compilatore di riservare della memoria per 3 variabili di tipo char, se tu dichiari char *buffer dici al compilatore che riservi un puntatore per una variabile di tipo carattere, ma se non assegni a char *buffer niente, non puntera a niente ma a una regione di memoria a caso, devi riservare prima o in seguito lo spazio che ti serve.
Una variabile stringa di 2 caratteri ha bisogno di 3 char 2 per i caratteri e 1 per il /NULL di fine stringa, char *buffer non riserva niente piu di 1 char.

Non ho ancora lavorato con Processing ma volevo vedere il tuo codice in puro stile C correggimi se sbaglio:

void loop() {

        int i=0; // Perche lo iniziizzi a zero ? lo fai gia dopo nel ciclo for.
  
      if (Serial.available() > 2) {

                for (i=0;i<2;i++) {         // i < 2 ? Non devi ricevere una stringa ? e lo spazio per il /NULL ? 

                incomingByte = Serial.read();

                    buffer[i]=incomingByte;

                }
                Serial.print("Ok i recived: ");
                Serial.println(buffer); // Forse il /NULL finale te lo inserisce gia questa funzione ? 

      }
//delay(10); 


}