Uso de Cadenas de Texto
1. Uso de Cadenas de Texto (string) en C con Arduino #
En C (y por extensión en Arduino), no existe un tipo de dato llamado string como en otros lenguajes modernos. En su lugar, las cadenas de texto se representan como arreglos de caracteres (char[]) terminados en \\0, y en Arduino también puedes usar la clase String, aunque con precauciones.
2. Opción 1: Usar char[] (más eficiente) #
Una cadena de texto es simplemente un array de caracteres:
1char saludo[] = "Hola";
Esto es equivalente a:
1char saludo[] = {'H', 'o', 'l', 'a', '\\0'};
El carácter especial \\0 (nulo) indica el final de la cadena.
Ventajas: #
- Menor consumo de memoria.
- No produce fragmentación de memoria.
- Compatible con funciones estándar de C.
Desventajas: #
- Más difícil de manipular (no tan intuitivo como
String).
3. Funciones útiles con char[] (incluidas en <string.h>): #
| Función | Descripción |
|---|---|
strlen() | Devuelve la longitud de una cadena (sin contar \\0) |
strcpy() | Copia una cadena en otra |
strcat() | Concatena dos cadenas |
strcmp() | Compara dos cadenas |
Ejemplo:
1#include <string.h> 2 3void setup() { 4 Serial.begin(9600); 5 char nombre[20] = "Juan"; 6 char saludo[40] = "Hola "; 7 8 strcat(saludo, nombre); // concatena "Hola Juan" 9 Serial.println(saludo); // Muestra: Hola Juan 10} 11 12void loop() {}
4. Opción 2: Usar la clase String (más cómoda pero más pesada) #
Arduino implementa una clase llamada String (con mayúscula), mucho más fácil de usar pero puede causar problemas en placas con poca SRAM (como Arduino Uno).
Ventajas: #
- Fácil concatenación, comparación, búsqueda.
- Sintaxis más amigable, similar a otros lenguajes como Java o Python.
Desventajas: #
- Uso intensivo de memoria dinámica (puede provocar fragmentación).
- No recomendable en proyectos grandes o con muchos datos.
Ejemplo básico con String: #
1String nombre = "Ana"; 2String mensaje = "Hola, " + nombre; 3 4void setup() { 5 Serial.begin(9600); 6 Serial.println(mensaje); // Muestra: Hola, Ana 7} 8 9void loop() {}
Funciones comunes de String en Arduino: #
| Función | Ejemplo |
|---|---|
length() | s.length() devuelve longitud |
charAt(i) | Accede al carácter en posición i |
substring(i, j) | Devuelve una subcadena |
indexOf() | Busca un carácter o palabra |
equals() | Compara dos strings |
toInt(), toFloat() | Convierte a número |
Ejemplo avanzado:
1String entrada = "25.5"; 2float valor = entrada.toFloat(); 3 4void setup() { 5 Serial.begin(9600); 6 Serial.print("Valor leído: "); 7 Serial.println(valor); // Imprime: 25.50 8}
5. Buenas prácticas #
- Usa
char[]si trabajas en proyectos con memoria limitada. - Usa
Stringsolo si necesitas manipulación compleja y tu proyecto es pequeño. - Si usas
String, evita concatenaciones dentro delloop()repetidamente, ya que crean nuevos objetos constantemente y fragmentan la memoria.
6. Ejemplo combinado: leer un comando serial y responder #
1String comando = ""; 2 3void setup() { 4 Serial.begin(9600); 5 Serial.println("Escribe 'encender' o 'apagar':"); 6 pinMode(13, OUTPUT); 7} 8 9void loop() { 10 if (Serial.available()) { 11 comando = Serial.readStringUntil('\\n'); 12 comando.trim(); // elimina espacios o saltos 13 14 if (comando.equals("encender")) { 15 digitalWrite(13, HIGH); 16 Serial.println("LED encendido"); 17 } else if (comando.equals("apagar")) { 18 digitalWrite(13, LOW); 19 Serial.println("LED apagado"); 20 } else { 21 Serial.println("Comando desconocido"); 22 } 23 } 24}
Resumen del tema
Conceptos clave #
- C-Strings (
char[]): cadenas tradicionales en forma de arrays de caracteres terminados en el carácter nulo\0; son estáticas, eficientes y no fragmentan la memoria SRAM. - Librería
<string.h>: funciones estándar de C (strlen(),strcpy(),strcat(),strcmp()) para manipulación directa y segura de cadenas. - Clase
String: interfaz de alto nivel orientada a objetos con métodos de conveniencia (substring(),indexOf(),toInt(),toFloat()), que requiere precaución en microcontroladores por su uso dinámico del heap. - Recepción Serial: lectura delimitada con
Serial.readStringUntil('\n')y limpieza de espacios contrim().
Qué debes recordar #
En proyectos con recursos limitados o bucles continuos, es preferible utilizar char[] para evitar la fragmentación progresiva de la memoria SRAM provocada por la clase String.