Professional Documents
Culture Documents
Lo primero que vamos a ver es la funcin Serial.read() , luego lo que son los arrays[],
como se definen e inicializan. Teniendo un conocimiento de los arrays[], despus
podemos introducirnos en el mundo de las Cadenas que son un caso especial de los
arrays[], y mas tarde con los punteros dada su similitud con las cadenas que
conceptualmente estn muy ligados dado que el elemento de la cadena es un puntero
indexado.
Serial.read()
Esta funcin lee de a un Byte nicamente,
y al hacerlo lo extrae del buffer. Recordemos que un dato que enviado desde el
Monitor Serial es primero interpretado como ASCII y el monitor lo que hace es
enviar los Bytes convertidos. Por ejemplo si enviamos un 1, el monitor interpretar
que es un ASCII, as, enviar el entero 49 que es el ASCII (1). Despus resta, como
nosotros desde Arduino, lo interpretemos o que tipo de variables utilicemos para
recuperarlo. El monito de Arduino cuando enva datos, lo hace de acuerdo a la
configuracin que tengamos seteada en dicho monitor. Si observamos tenemos
varias opciones de configuracin:
Serial.read()
Para nuestro anlisis carguemos el siguiente cdigo donde Arduino lo que hace es
renviar como looptodo lo mismo que recibe
Loop
49
Enviamos un 1 y Recibimos
49
10 LF/NL
Serial.available() Esta funcin retorna 1 si existen bytes disponibles para ser ledos ,
caso contrario devuelve -1 y hay que tener mucho cuidado cuando se la usa con
While() debido a que la velocidad de ejecucin del micro es muy superior a la
velocidad con que se reciben o transmiten los datos por el Serial Port. Supongamos el
siguiente programa:
Serial.available()
En primera instancia dejemos delay(100) comentada, para que no se ejecute.
49
13
10
Ciclo:0
As que ha tener cuidado con estas pequeas cosas que son grandes dolores de cabeza.
Arrays[]
Los arrays[] son arreglos de datos , tambin llamados vectores, en este caso de una
dimensin. El compilador reserva una cierta cantidad de bytes consecutivos en la
memoria para este tipo de datos, por lo tanto hay que especificarle una dimensin, es
decir la longitud mxima del mismo. Los arrays pueden contener cualquier tipo de
dato, inclusive Objetos. Los datos que contiene el array[] se llaman elementos del
arreglo y se numeran como 0,1,2,3,4,.(N-1), donde N es la dimensin. Puede
verse al array[] como un edificio de N pisos, cada piso tiene un departamento , 1
elementodonde vive una persona, entonces podemos hacer la analoga de la siguiente
manera para un edificio de 10 pisos:
Edificio[10], quiere decir que N=10, que es su longitud, y sus elementos ser 10
obviamente, uno en cada piso numerados del 0 al 9 (N-1)
int arreglo[10]; // De esta manera especificamos que cada elemento ser un entero.
Inicializacin de Arrays
Se pueden declarar arrays[] y asignar ms tarde o directamente declarar y asignarle
los elementos, vemos los casos posibles:
Recorriendo Arrays[]
El array[] se accede mediante el ndice de los elementos, dicho ndice x es un puntero
dentro del array[x] que apunta al contenido en la posicin x. Si int precios
[4]={10,24,10045,0}; precios[1] ser 24, el ndice x=1. Vemos como x es un
puntero ndice dentro del array. Entonces podemos recorrer un array[] desde x=0
hasta x=Dimensin-1.
Cadenas
Las cadenas, como fue introducido, son conjunto de caracteres con la caracterstica
que poseen un carcter especial de terminacin de cadena \0 o llamado
carcter Null de fin de cadena o ASCII(0). Existen varias maneras de definir cadenas.
La diferencia es que en caso de definirlas con arrays[] hay que inclur el \0 final de
cadena.
Cadenas
Se observa:
no soy-cadena
De esta manera hemos podido imprimirla dado que lo recorrimos como un vector,
como hemos visto.
Veamos lo siguente que pasa cuando la cadena, no es cadena y se usan las funciones
de librera de Cadenas
String datos=soy Juan; es una cadena
char cadena[]={s,o,y,-, c,a,d,e,n,a,\0}; esta tambin es cadena
La funcin concat permite unir cadenas, similar al operador + de cadenas tambin
con el Objeto String
Funcin concat
Operador +
Conclusin Importante: Si trabajamos los arreglos char[] como cadenas no olvidar
el carcter Null ya que si se pretende usar las funciones cadena va a haber problemas
extraos. Si queremos usar cadenas sin arreglos pueden usar el Objeto String que
permite definir variables cadena y automaticamente genera el Null. Las funciones
print/println son funciones que tratan a las variables como cadenas de texto
Funcines de cadena
unacadena.length(): devuelve la longitud de unacadena (es decir, el nmero de
caracteres). No se cuenta el carcter nulo que marca los finales de cadena. No tiene
parmetros.
A los efectos de ver como funcionan estos mtodos adjunto el siguiente programa con
algunas de ellas
funcionesCadena
Impresin Funciones Cadena
Recomiendo estas funciones ya que puede hacerse todo lo que necesitemos. Un
dispositivo cualquiera, sea monitor de Arduino o cualquier otro que tenga una
interface UART 232 TTL, puede enviar datos a Arduino y luego procesarse mediante
estas funciones cadena. Serial posee funciones propias que prcticamente hacen lo
mismo pero que en la prctica no las he necesitado realmente.
80-ASCII de P
97-ASCII de a
110-ASCII de n
97-ASCII de a
109- ASCII de m
0 ASCII NulL, como dijimos en la explicacin de getBytes(), el elemento [5] =
elemento[cantidad-1]= Null
Si quisiramos tomar en el vector Panam completo , deberamos sumar una unidad
ms a todo:
getBytes()
y la salida sera 80-97-110-97-109-97-Null. Ahora si son los Ascii de todo el
substring Panama
El arreglo[cantidad-1]=Nul, no tiene mucho sentido ni razn de porque es esto. Si la
conversin fuera no a Bytes[] sino a Char[], tendra sentido porque en realidad
obtendramos una cadena. Quizs sea un bug de la versin de Arduino.
Probemos entonces con toCharArray()
toCharArray()
Vemos que ahora no es necesario el bucle For como el caso anterior. Por qu? ,
porque arreglo2[] es un arreglo de caracteres y es uno de los argumentos favoritos de
Print y Println.
Por monitor sale: Panam , lo cual confirma que el elemento arreglo2[6]=Null por
lo que automticamente arreglo2[] se convierte en una CADENA y es por ello que es
bien aceptado por print().
Objeto String
Arduino tiene como recurso la variable String, que en realidad es un Objeto ya que si
recordamos , el Sketch hereda de C /C++ orientado a objetos. Ya hemos visto lo que
hace String, permite definir e inicializar cadenas. Lo ms frecuente es utilizar este
Objeto para trabajar con Cadenas en forma cmoda.
String cade=c;
String cad=123;
String ca=s.89;
Serial.println(cade+cad+ca);
Saldr: c123s.89
En resumen, lo ideal y por experiencia , si vamos a leer datos desde el puerto serial
desde el monitor de Arduino o desde cualquier dispositivo Serial asincrnico
tipo UART o Serial, lo ideal es leer carcter por carcter y guardarlo en un
arreglo buffer[] o cadena String y luego analizarla posteriormente para tratarla.
Podemos crear nuestro propio protocolo de comunicacin entre Arduino y cualquier
dispositivo Serial. Podemos correr una aplicacin de Java o C#, por ejemplo donde la
interface principal del programa enve una trama de datos en forma de cadena y al
principio y final de la cadena coloquemos uno caracteres especiales de final de trama
para que Arduino sepa dnde empieza y donde termina dicha trama y as detectarla
con el Serial.read(), ver Aplicacin Trasceiver de 433Mhz. Si vamos a leer desde el
Monitor de Arduino, recordar que todo lo que enve se le agrega CR y LF por default,
el cual es configurable tambin como vimos.
Por ltimo, vamos a ver una aplicacin donde desde el monitor enviamos un nmero
flotante, por ejemplo el 100.5 y deseamos interpretarlo como lo que es, ya que el
monitor va a tomar a dicho nmero como una cadena de caracteres y enviar
los ASCII uno a uno . Luego sumarle otro valor flotante , el mismo 100.5 y presentar
el resultado.
Recibiendo por SerialPort Arduino desde Monitor
El delay(20), como dijimos anteriormente es para asegurar la permanencia del flujo
del programa dentro del While(). Existe otra manera que es usar un flag que indique
el final de la recepcin, y que aunque salte el While() o salga del While() esto no
influya:
Utilizando
flag para que permita que While() salte
De esta manera permitimos evitamos el delay( ) del caso anterior que el bloqueante,
y el micro no puede hacer otra cosa que esperar. Esto permite que el Micro pueda
ejecutar otros procesos.
Si fuese por ejemplo un dispositivo, no desde el monitor , desde donde viniesen los
datos, por ejemplo BlueTooth() que tambin es serie, podramos inventar una trama
en donde la misma termine con el carcter z. Por ejemplo el dispositivo enva el
entero 145z y nosotros tenemos que filtrar y tomar el 145. Suponemos que CR y LF
no se usan as que para simular colocamos el monitor en Sin Ajuste de lnea aunque
de la otra manera igual funciona. Para probar este cdigo, desde el monitor haga Send
cualquier entero y z, ejemplo 14534z.
Cadena con fin de
trama
Con esto damos por terminada un recorrida de las diversas posibilidades que nos
permite trabajar con Cadenas y Arrays[] en general. Espero les sea de utilidad.