Strings no Arduino
Descrio
Strings de texto podem ser representadas de duas formas.
Voc pode utilizar o tipo de varivel String. Ou voc pode fazer uma string a partir de
um array de variveis do tipo char e adicionar a terminao nula.
Possibilidades para declarao de strings . Exemplos:
Todas as formas abaixo so declaraes vlidas de strings.
Declare um array de caracteres (char) sem inici-lo, como feito em Str1
char Str1[15];
Declare um array de caracteres (char), com um caractere adicional, e o prprio
compilador acrescentar o caractere de terminao nula, como feito em Str2
char Str2[8]
Adicionar explicitamente o caractere nulo, como em Str3
char Str3[8]
= {'a','r','d','u','i','n','o'};
= {'a','r','d','u','i','n','o','\0'};
Inicie com uma constante de texto, contida entre aspas; o compilador vai
definir o tamanho do array de caracteres automaticamente, calculando o tamanho da
string mais o terminador nulo, conforme Str4
char Str4[ ]
= "arduino";
Inicie um array com o tamanho declarado explicitamente e uma constante de
texto entre aspas, vide: Str5
char Str5[8]
= "arduino";
Inicie um array, deixando espao extra para strings com tamanhos maiores,
conforme Str6
char Str6[15] = "arduino";
Terminao Nula
Geralmente, strings so terminadas com um caractere nulo, (cdigo ASCII zero [0]).
Isto permite que funes (como a Serial.print()) conhecerem onde termina o texto da
string. Caso contrrio, essas funes continuariam a ler bytes da memria que no
fazem parte da string.
Isso significa que sua string precisa ter espao suficiente para um ou mais caracteres
alm do texto que voc deseja armazenar. por isso que a varivel Str2 e Str5
(acima) precisam de 8 caracteres, mesmo tendo a palavra arduino apenas 7 letras
a ltima posio preenchida automaticamente com o caractere nulo. Str4 ser
automaticamente redimensionada para o tamanho de 8 caracteres, sendo uma posio
para o nulo. Na varivel Str3, ns declaramos explicitamente o tamanho e adicionamos
o caractere nulo ('\0') por nossa conta.
Veja que possvel ter uma string sem o caractere final nulo (por exemplo, declarando
a varivel Str2 com 7 ao invs de 8 caracteres). Isso falhar na maioria das funes
que esperam uma string para funcionar, portanto no faa isso intencionalmente! Se
voc perceber um comportamento diferente, como adio de caracteres estranhos na
sua string, este pode ser o problema.
Aspas Simples ou Duplas?
Strings sempre so definidas escrevendo-se um texto contido entre aspas duplas
(exemplo: "Abc"), e caracteres sempre so definidos escrevendo-se uma nica letra
(ou dgito, ou algum caractere da tabela ASCII), contido dentre aspas simples, ou
apstrofes (exemplo: 'A').
Quebrando strings longas
Voc pode quebrar strings assim:
char myString[] = "Um texto que comea aqui"
" e termina logo"
" ali";
Array de Strings
Quando trabalhamos com uma grande quantidade de texto, em um projeto com
display LCD, por exemplo, muito comum fazer uso de um array de strings. Como as
strings por si s so arrays de caracteres, um array de string nada mais seno um
array bi-dimensional de caracteres.
No cdigo abaixo, o asterisco aps o tipo de varivel (char*), indica que esta varivel
um array de ponteiros. Todos os arrays na realidade so ponteiros de memria,
ento este o requisito para fazer arrays de arrays. O estudo de ponteiros uma das
partes mais difceis para um iniciante, mas necessrio entender ponteiros em
detalhes, para us-los de forma efetiva aqui.
Exemplo
char* myStrings[]={"This is string 1", "This is string 2", "This is
string 3",
"This is string 4", "This is string 5","This is string 6"};
void setup(){
Serial.begin(9600);
}
void loop(){
for (int i = 0; i < 6; i++){
Serial.println(myStrings[i]);
delay(500);
}
}
Objeto String
Descrio
A classe String nos permite utilizar e manipular strings de texto de uma maneira mais
completa aos arrays de caracteres. Voc pode concatenar textos, adicionar trechos de
texto, pesquisar expresses no texto e substituir trechos, e muito mais. Consome mais
memria que um simples array de caracteres, mas muito mais til.
Para referncia, arrays de caracteres so declarados como string com o s
minsculo, e instncias da classe String so declaradas como String, com a letra S
maiscula. Repare tambm que strings constantes, especificadas por aspas duplas, so
tratadas como arrays de caracteres, e no como instncias da classe String.
String stringOne = "Hello String";
// using a constant String
String stringTwo = String("This is a string");
// converting a constant string
into a String object
String stringOne = String(stringTwo + " with more"); // concatenating two strings
Funes
String()
charAt()
compareTo()
concat()
endsWith()
equals()
equalsIgnoreCase()
getBytes()
indexOf()
lastIndexOf()
length()
replace()
setCharAt()
startsWith()
substring()
toCharArray()
toLowerCase()
toUpperCase()
trim()
Operadores
[] (element access)
+ (concatenation)
== (comparison)
Exemplos
StringConstructors
StringAdditionOperator
StringIndexOf
StringAppendOperator
StringLengthTrim
StringCaseChanges
StringReplace
StringCharacters
StringStartsWithEndsWith
StringComparisonOperators
StringSubstring
int led = 8;
void setup() {
pinMode(led, OUTPUT);
Serial.begin(9600);
}
/**
* Funo que l uma string da Serial
* e retorna-a
*/
String leStringSerial(){
String conteudo = "";
// esvazia string
char caractere;
// Enquanto receber algo pela serial
while(Serial.available() > 0) {
// L byte da serial
caractere = Serial.read();
// Ignora caractere de quebra de linha
if (caractere != '\n'){
// Concatena valores
conteudo.concat(caractere);
}
// Aguarda buffer serial ler prximo caractere
delay(10);
Serial.print("String recebida: ");
Serial.println(conteudo);
return conteudo;
}
void loop() {
// Se receber algo pela serial
if (Serial.available() > 0){
// L toda string recebida
String recebido = leStringSerial();
if (recebido == "LED1:1"){
digitalWrite(led, HIGH);
}
if (recebido == "LED1:0"){
digitalWrite(led, LOW);
}
}
}