Publicado por el 30 enero, 2016 Deja tus dudas en los comentarios
Dificultad mediaComplejidad media
CC BY-SA 4.0

En muchas ocasiones nos enfrentamos a problemas en los cuales nuestros queridos microcontroladores tienen que analizar cadenas de caracteres. Si te has dedicado alguna vez a la inmótica o domótica y has tenido que trabajar en redes locales, 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 de comunicaciones no es tan crítico y por tanto podemos usar un lenguaje comprensible por cualquier humano, usando por ejemplo palabras del diccionario de la RAE. Podemos mandar a través de un puerto serie algo así como Relé 1 activado y 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 tie ine 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 buscamo is 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
}

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.


Sobre el autor
Enrique Gómez
Amante de la ingeniería electrónica, de la comunicación audiovisual y de la divulgación ingenieril y científica. Friki de Star Wars desde el principio. Puedes saber más sobre mi y sobre mis trabajos en enrique.rinconingenieril.es
Artículos relacionados
Deja un comentario