Go Down

Topic: RIcezione variabili da seriale, strano problema oltre le 3 cifre. (Read 1 time) previous topic - next topic

3ntin

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:
Quote

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.

whteice

anche io sono nuovo ma al primo impatto con arduino ci ho sbattuto un bel po su sto problema :P
ho modificato così
Code: [Select]
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
Code: [Select]
/*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.

3ntin

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:
Quote

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.

whteice

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 :)
cmq qui sul forum rispondono sempre a tutte le domande :)
al massimo dai un'occhiata qui arduino.cc/en/Reference/HomePage

Go Up