Go Down

Topic: leggere stringa da serial monitor (Read 24717 times) previous topic - next topic

lucadh

grazie per tutte le risposte!
purtroppo faccio un po' fatica a capire tutto quello che avete scritto. siete decisamente più avanti rispetto a me.
oggi ho un po' di tempo e proverò...
credevo che leggere una "parola" fosse molto più semplice e invece devo dire che(per me) non lo è...
anche io sono alle prime armi e ho bisogno di molto studio per arrivare alle vostre conoscenze.
detto ciò vi ringrazio moltissimo per l'aiuto.

proverò i codici e se avrò bisogno riscriverò!

Luca

Ciao Luca, ricordati di prendere ad esempio il secondo codice che ho postato!! (ma anche il terzo se preferisci, sono entrambi funzionanti).  ;)
"The only way to do great work is to love what you do. If you haven't found it yet, keep looking. Don't settle" Steve Jobs

"Se gommo tiene, io vince gara. Se gommo non tiene, io come bomba dentro montagna." Markku Alen

lucadh


nid69ita


Per esempio, l'idea di usare le string proposta da Pablos la capisco appena, se ho capito bene, tutto quello che viene sul buffer seriale viene accodato in una string da 100 caratteri giusto?  sarebbe tipo un'array ma di string?  ma poi, come si estraggono i dati da essa all'interno, come farei con un' array immagino? ovviamente a questo punto dovrei conoscere l'index o qualche char identificativo o separatore no? e poi dovrei convertirlo a int visto che quasi sempre sono dati numerici quelli che mi servono.  MMM...  C'è tanto da imparare...


Se si usassero linguaggi tipo Pascal o Basic (naturalmente su PC senza problemi di memoria) le stringhe sarebbero più semplici perchè gestite "di nascosto". In C invece il linguaggio è mantenuto grezzo perchè NON deve implementare gestioni speciali un pò come se lavorassimo in assembler. Perciò si lavora con gli array (vettori) di char (che poi il compilatore vede come puntatori) terminati semplicemente da '\0' o null.
Cioè il C nasce come semplificazione dell'assembler ma l'idea era un linguaggio senza gestioni specializzate come le strighe in basic o pascal.
Il turbo pascal di una volta, ad esempio, gestiva le stringhe (senza farlo sapere al programmatore) come vettori di 256 caratteri, dove il primo elemento era la lunghezza dei caratteri validi. Le funzioni sulle stringhe sapevano perciò di dover rispettare questa strutturazione. Si potrebbe implementare anche in C.
In C++ e quindi in Arduino (ma anche Java) è stato implementato invece l'oggetto String, che cerca di "nascondere" come è fatta/gestita una stringa.
In questo caso chi ha creato questa classe ha stabilito i nomi dei metodi ovvero dei comandi sulla stringa.
Purtroppo il C++ e Java danno per scontato che nel programma venga "aggiunto" un sistema di "pulizia" della RAM (garbage collection). Cosa che in Arduino non credo ci sia.

Spero di non aver aggiunto confusione e di non aver detto strunz@te.
my name is IGOR, not AIGOR

paoloc85

Ciao a tutti. Questo è il mio primo post.
Rievoco questo in quanto mi pare di aver trovato una soluzione a come leggere un numero dal serial monitor.
Questa funzione restituisce in num, il numero in decimale letto dal seriale.
Non ho fatto molti test, ma è già un inizio. Che ne pensate?
Code: [Select]

int SerialReadNum(){
  byte reading[4]; //conterrà il numero letto dal seriale - dimensione 5 per contenere il maxINT
  int i=0, j=0;
  int num=0; //valore restituito
 
  //leggo dalla seriale tutto il testo inserito
  while(Serial.available()){
    reading[i] = Serial.read())-48; //sottraggo 48 per converire da ASCII a numero
    i++;
   }
  i--;
  j=i;
  i=0;
  //converto le cifre in reading[] in notazione decimale
  while (j>=0){
   num = num + reading[j]*pow(10,i);
   i++;
   j--;
  }
  return num;
}

Ciao a tutti.

nid69ita

@PaoloC86,
Ti invitiamo a presentarti qui: http://forum.arduino.cc/index.php?topic=113640.0
e a leggere il regolamento: http://forum.arduino.cc/index.php?topic=149082.0
- qui una serie di schede by xxxPighi per i collegamenti elettronici vari: http://forum.arduino.cc/index.php?topic=146152.0
- qui le pinout delle varie schede by xxxPighi: http://forum.arduino.cc/index.php?topic=151646.0
- qui una serie di link utili: http://forum.arduino.cc/index.php?topic=126861.0

Per la tua funzione, esiste la parseInt() e la parseFloat()
http://arduino.cc/en/Serial/ParseInt
my name is IGOR, not AIGOR

gpb01

Paoloc85,
l'idea non sarebbe male e sarebbe per te mooolto più educativa che utilizzare le due funzioni belle e fatte indicate da nid  ]:D

Però ... vediamo alcune cose

Code: [Select]
byte reading[4]; //conterrà il numero letto dal seriale - dimensione 5 per contenere il maxINT

veramente così lo stai dimensionando di 4 elementi che vanno da 0 a 3 ! Un intero, con il segno, occupa 6 caratteri (-32768) e quindi minimo devi fare :

Code: [Select]
byte reading[6]; //conterrà il numero letto dal seriale - dimensione 5 per contenere il maxINT

Poi ...

Code: [Select]

while(Serial.available()){
    reading[i] = Serial.read())-48; //sottraggo 48 per converire da ASCII a numero
    i++;
}


... non fai nessun controlo su i ... e se continuano ad arrivarti caratteri che fai ? Vai a sovrascrivere aree di memoria a caso ?

E poi ancora :

Code: [Select]

i--;
j=i;
i=0;


... mi spieghi perché prima decrementi i e poi, senza fare altro, lo metti a zero ???  :smiley-eek:

E per ora mi fermo qui ...  :smiley-roll:

Insomma ... si notano tante belle lacune di C ... forse dovresti dedicare un po di tempo allo studio del linguaggio ... ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

nid69ita


Code: [Select]

    reading[i] = Serial.read())-48; //sottraggo 48 per converire da ASCII a numero


Penso che non hai neppure provato a compilarlo, perchè qui c'e' un errore di sintassi, bloccante. Apri 1 tonda e ne chiudi 2
my name is IGOR, not AIGOR

paoloc85

Grazie a tutti per le correzioni, scusate per la mancata presentazione e grazie per gli interessantissimi link, per me, niubbo quale sono  :P
Effettivamente, la parentesi in più è un refuso, avevo fatto una prova, poi cancellata non del tutto  :smiley-roll:
Quanto alla dimensione dell'array, beh, ero convinto (reminscenze di un bel po di anni fa) che array[4] avesse indici da 0 a 4 quindi 5 elementi...  :~
Infine, si, ve l'ho detto che non ho fatto molti test, e so bene di dover fare un controllo quanto meno sull'indice, per evitare di accedere ad una posizione di memoria non valida avevo semplicemente fretta  :P

Perché faccio
Code: [Select]
i--;
j=i;
i=0;
?
Perché, ripeto, l'ho scritto velocemente, volevo in j il valore di i-1 e volevo i a 0.
Certo meglio sarebbe stato scambiare l'uso di i e j e scrivere semplicemente:
Code: [Select]
i--;
j=0;

Ma sul momento non mi è sovvenuto.

Infine, se nelle numerose ricerche che ho fatto su google per "leggere numero da seriale arduino" e cose del genere, avessi trovato un riferimento alla funzione postata da nid pensi che mi sarei preso la briga di scrivere una funzione?  :P
Quanto meno ho tolto un po' di polvere dal cervello.
Grazie di nuovo per le correzioni,

Go Up