Leggere stringa da seriale

Ciao a tutti,
finora con gli esperimenti che ho fatto, ho sempre fatto leggere ad arduino un solo carattere alla volta tramite porta seriale.
Siccome pensavo di fare qualcosa di più complesso, come ad esempio istruzioni del tipo "TRE230" per scrivere sul pin 3 (pwm) il valore 230, cercavo un modo per leggere e memorizzare queste stringhe (e poi eventualmente fare il parsing).
Come prima soluzione pensavo di stabilire una lunghezza standard delle mie istruzioni (ad esempio 6 caratteri) ed inserire i sei caratteri ricevuti tramite Serial.read() in un vettore di char (una stringa).
In teoria dovrebbe funzionare, ma esiste qualcosa di più comodo?

Io per leggere dalla seriale uso questo codice, vedi un po' se ti è utile e lo puoi adattare:

char * read_terminal(){
    String text;
    byte temp;
    char text_temp[128];

    Serial.flush(); //svuota il buffer
    temp = 0;
    text = "";
    do {
        if (Serial.available() > 0) {
            temp = Serial.read();
            Serial.print(char(temp));
            if (temp != 13) {
                text += temp;
            }
        }
        if (temp == 13) { //invio? allora esci
            Serial.flush();
            break;
        }
    } while ( true ); //ciclo infinito - si esce solo col "break"
    text.toCharArray(text_temp, 128);
    return text_temp;
}

La funzione read_terminal() legge da terminale finché non premi INVIO (char 13) e poi restituisce una stringa di char che puoi manipolare con le funzioni classiche del C. La max lunghezza che accetta è 128. Si può fare anche usando il tipo di dati String del C++ ma poi diventa più macchinoso parsare i dati ricevuti.

Grazie.
Ma lo usi così comè??
a me dice:
unecpected token; char

uffa!! :drooling_face:

char * sTemp;
sTemp = read_terminal();

Dovrebbero bastare queste 2 righe di codice.

Cmq mi fai venire un dubbio perché questa funzione l'ho riarmeggiata da una che operava con gli String e fa parte di uno sketch che mi sta dando problemi. La compilazione non dà errori però ad esser sinceri non ho mai provato dal vivo questa nuova versione. In che punto ti da l'errore?

Intanto grazie! :slight_smile: è quello che cercavo ma devo ancora provarla...
A prima vista mi è venuto un dubbio: il carattere 13 associato all'INVIO, vale sia per linux che per windows? (io utilizzo linux)

Anch’io uso Linux. Cmq è uguale sia per Linux che per Windows perché i primi 127 caratteri della tabella ASCII sono (o dovrebbero esserlo) standard, quindi il carattere 13 corrisponde a “\n” cioè invio.

Il fatto è che, se non ricordo male, per linux il carattere a capo è "\n", mentre per windows "\r\n". Però per fortuna mi interessa farlo funzionare su linux :wink:

Quello vale nei file come terminatore di riga, nel senso che se leggi un file Linux da Windows, questo SO non capirà i ritorni a capo perché appunto la sequenza è per esso incompleta.
Con i caratteri vai tranquillo: è dai tempi del DOS che chr(13) è il tasto Enter/Return/Invio ecc

Meglio così! Almeno questo è standard :wink:

attento che il terminale di arduino non invai il carattere \n!! questo crea qqualche casino, o usi un altro carattere tipo '*', o usi un programma esterno.

Il terminale di Arduino può inviare il carattere "\n", basta specificare il terminatore di linea nell'apposita opzione in basso nel menu a tendina (scegliere "Newline" per avere "\n").
Cmq il terminale di Arduino NON è un vero terminale pertanto l'avviso di Lesto resta comunque valido. Difatti io uso su Linux gtkterm che reputo ottimo per lavorare con Arduino.