Leggere valori da un flusso seriale

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:

void loop() {
  if (MySerial.available() > 0)
  {
    Serial.write(LiSerial.read());
  }
}

A questo punto visualizzo correttamente i dati sul monitor, come stringhe così formattate:

9.32567e2 2.57390e1 3475582 5595772 3329065 4461789
9.33078e2 2.57390e1 3476064 5596901 3329213 4461959
9.33505e2 2.57403e1 3476107 5596567 3329300 4462077
......

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.

Grazie per gli eventuali consigli!

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.

float var1;
float  var2;
....
if (Serial.available() )
  {
    var1 = Serial.parseFloat();
    var2 = Serial.parseFloat();
    Serial.parseInt();
    Serial.parseInt();
    Serial.parseInt();
    Serial.parseInt();

    Serial.println(var1);
    Serial.println(var2);
  }

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.

Cosi invece sembra funzionare.

1 Like

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!

Serial.println(var1, 5);
Serial.println(var2, 5);

Per quanto riguarda l'esponente non so se c'è modo di rappresentare un float in questo modo con la classe Serial, ma non credo

In effetti ripensandoci bene, credo che lo sketch in questione non vada per nulla bene perché non tiene conto in modo corretto dell'esponente...

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...

prova a leggere QUI

che ti rimanda QUI

e poi QUI

1 Like
    float f = 0.0000589;
    char cf[20] = {0};
    Serial.println(dtostre(f, cf, 5, 0));
// stampa 5.89000e-05

Prova questo nella funzione setup().

dtostre

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.

Ciao.

1 Like

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.

9.32567e2 2.57390e1 3475582 5595772 3329065 4461789
9.33078e2 2.57390e1 3476064 5596901 3329213 4461959
9.33505e2 2.57403e1 3476107 5596567 3329300 4462077

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.

sketch.ino - Wokwi Arduino and ESP32 Simulator

P.S.
Per quanto riguarda la ricezione seriale per comodità ho banalmente usato una String (:open_mouth: :open_mouth: :open_mouth:) e la funzione Serial.readStringUntil('\n'); ma ovviamente si può fare anche con un char array.

1 Like

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!

AGGIORNAMENTO:

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!

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.