En muchas ocasiones nos enfrentamos al problema de analizar cadenas de caracteres con un microcontrolador. Si te has dedicado alguna vez a la inmótica o domótica y has tenido que trabajar en redes y dispositivos IoT, ya sabes la potencia que tienen las cadenas de caracteres. En Arduino disponemos de un método para analizar cadenas de caracteres almacenadas en String, este método es indexOf() y lo usamos en muchas ocasiones.
Digamos que lo de trabajar en lenguaje máquina, es muy bonito, pero es poco práctico. Soy el primero que en ocasiones para reducir el tiempo que se tarda en realizar una comunicación entre micros envío los datos en alto nivel, creando una secuencia de bits en la que cada uno de ellos representa algo de información. Por ejemplo el estado de un relé o de un botón, 01001001.
Sin embargo, hay ocasiones en la que el tiempo no es tan crítico y por tanto podemos usar un lenguaje comprensible por cualquier humano y mucho más sencillo. Podemos mandar a través de un puerto serie algo así como Relé 1 activado. Para entender esta orden entre micros no necesitamos ser Ingenieros ni saber como es el mapa de memoria del micro, ni siquiera necesitamos saber que es el buffer de memoria del puerto serie.
Imaginemos que queremos comunicar dos micros entre si: el primero controla salidas digitales y el segundo controla una memoria EEPROM en la cual almacenamos el estado de las salidas digitales (no me preguntes que aplicación tiene esto, se me acaba de ocurrir) así que cada vez que hay un cambio en una de las salidas digitales, el microcontrolador A manda a través de puerto serie algo como:
nON o nOFF
Donde n es el número de la salida digital y ON o OFF es el estado en el que se encuentra.
El microcontrolador B, recibe esta información y lo almacena en su buffer. Nosotros, en nuestro código, recuperamos cada byte recibido y lo almacenamos en una cadena de caracteres que llamaremos «orden«.
Nuestro siguiente objetivo es analizar este string y tomar una decisión en función de lo que hemos recibido. Así que, vamos a usar indexOf(); para localizar en que posición del string orden está el carácter ‘O’.
int posicion = orden.indexOf("O");
En la variable «posicion» se ha almacenado en que posición del string se encuentra la letra/carácter ‘O’.
Ahora que sabemos en que posición está la ‘0’, vamos a analizar los datos recibidos.
- El número de la salida digital cuyo estado hemos cambiado estará en posición-1. Es decir, el carácter anterior a la letra ‘O’.
- Si hemos activado la salida, posicion+1 será una ‘N’. Es decir, el carácter a continuación de la ‘O’ será una ‘N’.
- Si hemos desactivado la salida, posicion+1 será una ‘F’. Por tanto, el carácter que encontramos a continuación de la ‘O’ será una ‘F’.
En resumen, localizamos la letra O y luego buscamos la N de ON o la F de OFF. De esta manera sabemos si hemos activado o desactivado la salida digital.
Por tanto algo así como:
if(orden[posicion+1] == ‘N’){
//Hemos activado la salida
} else if(orden[posicion+1] == ‘F’){
//Hemos desactivado la salida
}
if(orden[posicion+1] == 'N'){ //Hemos activado la salida } else if(orden[posicion+1] == 'F'){ //Hemos desactivado la salida }
¿Está o no está en el String? Esa es la cuestión de indexOf
Otra de las cosas que podemos hacer con indexOf() es averiguar si en un string tenemos alguna palabra o carácter concreto, imagina que tenemos un string al que llamamos abecedario = «abcde….» y queremos averiguar si en nuestro string tenemos la letra d, pues podemos hacer algo como esto:
if(abecedario.indexOf("d") > 0){ //Si encuentra el carácter, entraremos en el if }
En resumen, podemos usar indexOf() para buscar letras o conjuntos de caracteres dentro de un String. La función nos devolverá un número.
Si no encuentra lo que buscamos, la función indexOf devolverá -1.
Si encuentra el carácter que buscamos, indexOf devolverá la posición en la que se encuentra dicho carácter dentro del String. En el ejemplo del abecedario, si buscamos la letra d, indexOf devolverá el número 3, la posición de la ‘d’.
Échale un vistazo al vídeo y si tienes cualquier pregunta escríbeme y te responderé lo más rápido que pueda.