RIcezione variabili da seriale, strano problema oltre le 3 cifre.

Ciao a tutti, sto sviluppando un progetto scolastico che prevede il controllo di un robot cartesiano, mosso da motori paso-passo, da parte di Arduino, che dovrebbe ricevere le coordinate via seriale da un PC e calcolare gli spostamenti da fare.
Quando ho iniziato a scrivere il programma ho pensato prima di tutto di fare la parte seriale, che avendo già utilizzato diverse volte questa funzione mi sembrava più semplice. Però sono incappato subito in un problema, cioè che Arduino riceve un solo byte alla volta e quindi, per ricostruire il numero a più cifre inviato dal computer ho scritto il seguente programma:

int X= 0;
int count= 0;
int Nbyte= 0;

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

void loop() {
if(Serial.available()> 0){
Nbyte= Serial.available();
X= 0;
int rxX[Nbyte];
for(count=(Nbyte-1); count>=0; count--){
rxX[count]= (Serial.read()-'0');
}
for(count=0; count<Nbyte; count++){
X= X+((rxX[count])*(pow(10,count)));
}
Serial.println(X);
}
delay(500);
}

Teoricamente dovrebbe funzionare, ma si ripresenta a ogni tentativo un fastidiosissimo problema, se mando un numero a 2 cifre, ad esempio 99, Arduino mi restituisce correttamente 99, mentre se lo mando a più cifre, ad esempio 999, o 9999 mi restituisce rispettivamente 998 e 9997, cioè sembra togliere un unità ogni cifra in più, quando si superano le tre.
Ho controllato e ricontrollato, fatto mille tentativi per risolvere ma non riesco a uscirne, per piacere aiutatemi a capire dov'è l'errore, e se addirittura il metodo non va bene mostratemi quello giusto.

Grazie dell'attenzione,
Andrea.

anche io sono nuovo ma al primo impatto con arduino ci ho sbattuto un bel po su sto problema :stuck_out_tongue:
ho modificato così

int X= 0;
int count= 0;
int Nbyte= 0;

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

void loop() {
  if(Serial.available()> 0){
    Nbyte= Serial.available();
    X= 0;
    char rxX[Nbyte];
    for(count=(Nbyte-1); count>=0; count--){
      rxX[count]= (Serial.read());
      
    }
    /*for(count=0; count<Nbyte; count++){
      X= X+((rxX[count])*(pow(10,count))); 
    }*/
    X=atoi(rxX);
    Serial.println(X);
    
  }  
  delay(500);
}

questo pezzo non ho capito cosa fa scusa l'ignoranza

/*for(count=0; count<Nbyte; count++){
      X= X+((rxX[count])*(pow(10,count))); 
    }*/

però adesso ti restituisce tutte le cifre che immetti in maniera corretta
spero di esserti stato d'aiuto.

Una luce nel buio! perché anche cercando su internet non si trovano ste cose?
Io non sapendo ne leggere ne scrivere (come dicono dalle mie parti) ho raccolto ogni cifra ricevuta in un array, dall'ultima alla prima, poi per ricostruire il numero ho usato la notazione esponenziale, quindi le unità sono moltiplicate per 10^0 (cioè 1), le decine per 10^1 (cioè 10), le centinaia per 10^2 (cioè 100) e così via...
Poi sommato i vari numeri che dovrebbero rendere il numero ricevuto, come infatti avviene, ma con il fastidioso problema delle unità scartate, sarebbe interessante capire perché non funziona.
Comunque il tuo programma è sbagliato, perché stampa i numeri al contrario, dato che sul mio era invertito il ciclo for per la ricezione, ecco il programma giusto:

int X= 0;
int count= 0;
int Nbyte= 0;

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

void loop() {
if(Serial.available()> 0){
Nbyte= Serial.available();
X= 0;
char rxX[Nbyte];
for(count=0; count<Nbyte; count++){
rxX[count]= (Serial.read());
}
X= atoi(rxX);
Serial.println(X);
}
delay(500);
}

Ti ringrazio tantissimo, perché sono due settimane che provo e riprovo e cerco invano su internet, sei stato veramente d'aiuto. un ultima domanda, non è che avresti un veloce tutorial su come gestire le classi su arduino?

Grazie ancora,
Andrea.

al contrario? ahahhaha scusa avevo provato con 99 e 999 e 9999 ahahahah
tutorial? no non ne ho, ho iniziato anche io da pochissimo e vado di google anche io :slight_smile:
cmq qui sul forum rispondono sempre a tutte le domande :slight_smile:
al massimo dai un'occhiata qui arduino.cc/en/Reference/HomePage