Librería Arduino Parser


La librería Arduino Parser implementa funciones para interpretar de forma sencilla la información contenida en un char Array o en un String. Dispone de funciones para leer números, subcadenas, buscar un caracter, así como varias funciones para desplazarse o buscar a lo largo del buffer.

Está diseñado para trabajar con un array recibido por un medio de comunicación (por ejemplo, puerto serie), pero el Parser no realiza la recepción ni modifica los datos. De esta forma es posible emplearlo con cualquier char array, independientemente de su origen.

Arduino Parser está diseñado para trabajar junto con la librería AsyncSerial, que realiza la recepción de datos por puerto de serie de forma no bloqueante.

Instrucciones de uso

La librería Arduino Parser trabaja sobre un buffer de char array, que es proporcionado externamente al objeto. El Parser no recibe, ni modifica en ningún momento el buffer, por lo que es seguro usarlo en cualquier array. El buffer y su longitud se reciben en el constructor del Parser. No obstante, es posible cambiarlo en cualquier momento con las funciones Init().

Anuncio:

Parser proporciona funciones para realizar la lectura de datos (bool, char, números, strings). Estas funciones devuelven el objeto leido y avanzan el cursor al elemento actual CurrentIndex las posiciones oportunas, si la lectura ha tenido éxito.

Por otro lado, todas las funciones de lectura admiten una función de callback, que dispara si la lectura la lectura ha tenido éxito. Es posible emplear funciones lambda (pero no obligatorio) para conseguir un código más compacto.

Esta forma de uso es algo más avanzada, pero permite discriminar si la lectura ha sido realmente válida (por ejemplo, leer un entero devuelve 0, aunque no haya tenido éxito, mientras que la función de callback sólo dispara si la lectura es realmente correcta).

Por otro lado, tenemos las funciones Compare(...) que comparan el punto actual del buffer con un String. Estas funciones son útiles, por ejemplo, para discriminar el comando recibido en un puerto de serie. Las funciones Compare(...) necesitan las longitud de la cadena comparada. Si, por diseño, la mayoría de vuestros comandos tienen la misma longitud podéis usar el atributo DEFAULT_COMMAND_LENGTH y no proporcionarlo en aquellos Compare(...) que tengan esa longitud.

Por su parte, las funciones Search(...) buscan en el resto del buffer en búsqueda de un char. Podemos usarlas, por ejemplo, para dividir un array separado por comas con un número variable de elementos. Las funciones IfCurrentIs(...), IfCurrentIsNot(...), DoUntil(...) y DoWhile(...) permiten implementar de forma sencilla condicionales y bucles sobre el buffer. Adicionalmente tenemos las funciones de desplazamiento en el buffer Skip(...), SkipWhile(...), SkipUntil(...), JumpAfter(...), JumpTo(...).

Finalmente, tenemos una serie de funciones estáticas que comparan un char, y están diseñadas para proporcionarse a cualquiera de los métodos anteriores. Así, por ejemplo, es posible avanzar en el buffer hasta que se encuentre un dígito o desplazarse mientras se encuentre un separador.

Unidas todas estas funciones nos dan un gran potencial para interpretar casi cualquier trama que tengáis como comunicación en vuestro proyecto. Consultar los ejemplos para ver algunas combinaciones posibles. (Hay ejemplos con/sin funciones de callback y con/sin funciones lambda).

Constructor

El objeto Arduino Parser se instancia a través de uno de sus constructores

Pero podemos cambiar el buffer usando las funciones Init(...)

Uso de Arduino Parser

Para realizar la interpretación de lectura del buffer tenemos las funciones Read_(...) que devuelven el valor leído, y avanzan el cursor si la lectura ha tenido éxito. Adicionalmente admiten una función de callback que recibe como parámetro el valor leído, y dispara únicamente si la lectura ha sido correcta.

Las funciones de lectura de cadenas de texto necesitan un separador válido para finalizar la lectura. Igualmente, admiten una función de callback que dispara si la lectura ha tenido éxito.

Por otro lado, el parámetro opcional endIfNotFound indica si, en caso de no encontrar el separador, se considera válida la cadena hasta el final del buffer. Por defecto es true ya que es útil, por ejemplo, para dividir cadenas cadenas separadas por coma (donde el último dato no tiene coma al final)

Los métodos Compare(...) son unos de los principales del Parser, y permiten comparar la posición actual del buffer con una cadena de texto. Es necesario proporcional la longitud de la cadena comparada. En caso de obviarse se empleará el campo DEFAULT_COMMAND_LENGTH, que es útil si la mayoría de los comandos comparados tienen la misma longitud.

Las funciones Search(...) buscan una cadena de texto en el resto del buffer, y devuelven si se ha encontrado o no la ocurrencia. No modifican la posición actual en el buffer, si no que sirven para determinar si tenemos que realizar un tipo de lectura u otra.

Las funciones de Loop e Ifs permiten realizar una acción en el buffer en función de una condición. En la mayoría de casos los emplearemos junto con las funciones de Search(...), pero cualquier otra condición es posible.

Los métodos Skip(...) permiten ignorar ciertos elementos del buffer y avanzar el cursor.

Los métodos Jump(...) permiten avanzar hasta que se cumpla una condición en el buffer.

Las funciones estáticas de comparación permiten agrupar conjuntos de caracteres. Se emplean en todas las funciones anteriores, para conseguir condiciones más complejas que únicamente comparar con un caracter.

Ejemplos

La librería Parser incluye los siguientes ejemplos para ilustrar su uso.

  • Simple: Ejemplo sencillo que muestra el uso de algunas funciones.

  • CommandRecieve: Muestra un uso sencillo para recibir órdenes y comandos, con y sin funciones lambda.

  • Led: Muestra un posible uso para interpretar una trama que enciende o apaga un Led recibiendo ON o OFF.

  • Servo: Muestra un posible uso para interpretar una trama que movería un servo a un ángulo.

  • SerialExample: Muestra un uso posible junto con recepción por puesto Serie. (la recepción es mejorable, pero es un ejemplo sencillo).

  • CommaSeparated: Muestra un posible uso para interpretar números separados por comas, usando y sin usar success callbacks.

  • SplitText: Muestra un posible ejemplo para dividir un texto por diferentes tipos de separador.

Instalación

  • Descargar la última versión desde GitHub
  • Descomprimir el archivo
  • Copiar en tu carpeta de librerías (normalmente Mis Documentos\Arduino\libraries)
  • Relanzar el IDE de Arduino

Si te ha gustado esta entrada y quieres leer más sobre Arduino puedes consultar la sección
tutoriales de Arduino

Anuncio:

Previous Gestionar directorios y ficheros desde consola comandos en Raspberry Pi
Next Cómo conectar un ESP8266 a una red WiFi (modo STA)
1000