lettura stringhe dal buffer seriale

salve a tutti,

il mio primo arduino è appena giunto tra le pareti di casa mia, e manco a dirlo ho già la prima domanda per voi del forum -_-'

Ho provato a caricare sull'arduino il programma di esempio per la lettura da seriale (arduino.cc/en/Serial/Read) e ho notato che se si invia al dispositivo (attraverso il serial monitor) una stringa di più caratteri in "un colpo solo" (ossia digito la parola e premo invio), esso restituisce sì tutti i caratteri ricevuti, ma separati (ognuno dopo la frase "I received:"). Ok, certo, la funzione è int, quindi ogni volta che viene chiamata restituisce un solo byte, poi il loop si ripete e ne restituisce un altro e così via, fino allo svuotamento del buffer. Nel caso specifico di questo programma non è stato difficile ovviare al "problema", ma questo mi ha fatto sorgere un dubbio più generale.

Come mai la funzione serial.print è in grado di gestire una stringa, mentre la funzione serial.read no? Sarebbe molto comodo, ad esempio, chiamare una funzione in grado di salvare tutti i dati ricevuti in ingresso in una string, della quale poi poter fare ciò che si vuole (nel caso più banale farla direttamente stampare da serial.print).

Immagino che questa "asimmetria" riguardi qualche difficoltà a fare in modo che una funzione restituisca in uscita una stringa, ma non ne sono tanto sicuro, in verità su questo non ho le idee molto chiare.

Allora ho pensato di andare un po' a vedere come erano fatte le funzioni "serial." per capire con che logica fossero costruite e se potevo scrivermi da solo la funzione di lettura così come la desidero, ma... non ci sono riuscito! ora, immagino che essendo tutta la piattaforma open source, in qualche modo si possa accedere alla libreria delle funzioni "integrate" nel linguaggio, ma non so come.

Ecco, questo è tutto, spero che la questione non sia troppo banale, ho cercato di rispondere ai miei dubbi senza dover scrivere qui, ma le mie ricerche sul sito e sul forum non mi hanno portato a niente di utile.

in ogni caso grazie,
athos

ciao

se vai nella cartella di arduino sotto
hardware/cores/arduino c'è il sorgente di tutto

Serial.read con una stringa arbitraria non ha senso a meno che non si definisca un terminatore ed inoltre richiederebbe l'allocazione dinamica di un buffer.
dato che arduino ha 1k di ram bisogna essere parsimoniosi.

trovi parecchi esempi su come leggere intere stringhe via seriale

che scemo, io avevo cercato in lib, e di guardare nella cartella hardware non m'era passato proprio per la testa... quando si dice le tare mentali!

Le problematiche che hai definito per serial.read e le stringhe arbitrarie sono proprio quelle che ho incontrato cercando di "generalizzare" la mia soluzione al "problema" dell'esempio, ma data la mia scarsa competenza temevo fosse un problema mio.

Mi rispulcio il sito e il playground alla ricerca di altri esempi, ma comunque il mio dubbio era più che altro "ontologico" e ti ringrazio per avermi chiarito le idee :slight_smile:

In realtà il problema delle stringhe in arduino è annoso.. La ram è molto poca perciò bisogna stare attenti a fare malloc di vario tipo altrimenti dopo un po non va più nulla.

Sarebbe però utile che qualcuno con un po di esperienza di c++ lavorasse a una classe String per arduino.

ce n'è già una in giro ma andrebbe migliorata

m