Negli esempi precedenti dalla porta seriale veniva letto un solo carattere. La gestione di una successione di più caratteri, chiamata stream, è più complicata.

L'esempio che segue mostra come una successione di caratteri inviata dal PC può essere messa in una variabile di tipo stringa.

String str;

void setup() {
Serial.begin(9600);
}

void loop() {
while( Serial.available() > 0) {
str = Serial.readStringUntil('\n');
Serial.println(str);
}
}

Vediamo in dettaglio gli elementi significativi del codice.

String str;

definisce una variabile di tipo stringa vuota.

 

while( Serial.available() > 0) { }

esegue il codice contenuto tra le due parentesi graffe {   } fino a  quando c'è un carattere nel buffer di ingresso della porta seriale.

 

str = Serial.readStringUntil('\n');

legge il contenuto del buffer seriale fino a quando non trova il carattere a capo o new line '\n' corrispondente al codice ASCII 10 decimale (corrispondente al 000A Unicode) e lo inserisce nella stringa str.

Da notare che le cose funzionano solo se nel monitor seriale viene impostato correttamente il terminatore di riga.

Le stringhe

 

 

Le stringhe sono assimilabili a vettori di char con la caratteristica di avere un terminatore, ovvero un carattere speciale, chiamato NULL e corrispondente al codice ASCII 0 (zero), che ne indica la fine.

Ciò consente alle funzioni, come ad esempio Serial.print(), di individuare dove si trova la fine della stringa. In caso contrario, continuerebbero a leggere i successivi byte di memoria che non fanno effettivamente parte della stringa.

Questo significa che una stringa contiene sempre un carattere in più rispetto al testo che si desidera contega. Per esempio la stringa "Arduino" è composta da 8 caratteri (7 per la parola Arduino  più uno per il carattere NULL).

Virgolette singole o virgolette doppie?

Le stringhe sono sempre definite tra virgolette doppie ("Abc"), i caratteri sono sempre definiti tra virgolette singole ('A').

Comparazione di stringhe

Per verificare se una stringa corrisponde o no ad un'altra stringa è necessario utilizzare l'istruzione if-else eventualmente annidati. L'istruzione  switch non è invece utilizzabile.

Il codice che segue mostra come verificare se la stringa ricevuta è "pippo".

String str;

void setup() {
Serial.begin(9600);
}

void loop() {
while(Serial.available() > 0) {
str = Serial.readStringUntil('\n');
if (str == "pippo") {
Serial.println("str == \"pippo\"");
} else {
Serial.println("str non e' \"pippo\"");
}
}
}

Gli operatori di confronto String utilizzzabili sono: == (uguale); != (diverso); <; >, <=; >=.

A questi si aggiungono i metodi equals() e equalsIgnoreCase(). L'operatore == e il metodo equals() operano allo stesso modo, ovvero

 

if (stringOne.equals(stringTwo)) {

è identico a

if (stringOne == stringTwo)  {

Gli operatori ">"  (maggiore di) e "<" (minore di) valutano le stringhe in ordine alfabetico, in base al primo carattere in cui i due differiscono. Quindi, per esempio "a" < "b" e "1"<"2", ma "999" > "1000" perché il cararrere '9'  viene dopo del carattere '1'.

Last modified: Wednesday, 10 January 2024, 5:31 PM