Ciao a tutti,
Sto cercando di leggere dei dati provenienti da uno strumento dotato di porta seriale.
Il circuito è semplicissimo, ho solo interposto un adattatore RS232 - TTL tra lo strumento e Arduino UNO e creato una SoftwareSerial sui pin 3 e 4.
Poi leggo quello che esce dalla seriale e lo visualizzo sul monitor seriale, tramite le 2 semplici righe:
Quello che vorrei fare è mettere i primi due numeri in due variabili distinte.
Ho provato a cercare dei caratteri come ad es. lo spazio o il ritorno a capo '\n', ma non funziona.
Penso che potrebbe tornarmi utile strchr(), ma non so bene come utilizzarlo.
Se lo schema dei dati è sempre quello, puoi usare due Serial.parseFloat(); per la due variabili e poi 4 volte Serial.parseInt(); "a vuoto" (anche se secondo me c'è il fine linea \n altrimenti non ti andrebbe a capo sul monitor seriale, cosa che sarebbe auspicabile per rendere più robusto il parsing dei dati).
Certo non è il massimo, andrebbero implementati dei meccanismi di controllo dei dati.
Mi auto-rispondo... il parseFloat() si comporta in modo strano con questa sequenza di numeri.
In pratica becca solo il primo valore in modo corretto, credo che i caratteri e2 ed e1 sballino tutto.
Grazie mille cotestatnt!
Il codice che mi hai consigliato sembra funzionare, nel senso che in effetti mi capta le due variabili, c'è solo (credo) un problema di visualizzazione... quando fa il Serial.print(), mi visualizza solo le prime due cifre decimali, senza mettere la notazione esponenziale.
ad esempio, mi esce quanto segue:
9.33 | 2.61
9.32 | 2.61
9.32 | 2.60
......
Quindi mancano 3 decimali e l'esponente.
Adesso vedo se capisco come formattare l'output!
Grazie ancora.
In effetti ho fatto diverse prove, ma non riesco a pescare l'esponente.
Ma non si può leggere un carattere alla volta e metterlo in una variabile stringa, poi me lo spacchetto come voglio e mi tiro fuori l'esponente?l'idea ce l'ho, ma non so come metterla in pratica...
Però in effetti sarebbe bene stampare i codice ascii byte per byte prelevati dalla seriale per vedere anche i terminatori. Qui c'è del codice per farlo.
Io temo che sia l'unico modo che hai disponibile e ci sono diverse possibilità di implementazione dell'algoritmo.
Io però non ho ancora ben capito se i caratteri che ricevi hanno oppure no il terminatore di riga.
Se scrivi che sul serial monitor hai questo, io mi aspetto di si.
Ho aggiornato l'esempio usando l'istruzione standard sscanf() che però su Arduino non funziona con i float ed ho quindi diviso le variabili in parte intera, parte frazionaria ed esponente per poi ricostruirle con una semplice operazione matematica.
P.S.
Per quanto riguarda la ricezione seriale per comodità ho banalmente usato una String ( ) e la funzione Serial.readStringUntil('\n'); ma ovviamente si può fare anche con un char array.
Ragazzi, grazie a tutti per i consigli e gli aiuti, soprattutto con gli spezzoni di codice, molto utili, ho fatto già qualche passo avanti!
Adesso chiudo tutto e vado in ferie, vi aggiorno tra una decina di giorni, che mi rimetterò al lavoro su questo progetto!
Grazie ancora e buona giornata!
con le vostre dritte e soprattutto con le righe di codice suggerite da cotestatnt, riesco a leggere perfettamente i valori, per mandarli via wifi ad un server!
GRAZIE ancora, come al solito il forum è molto utile!