miércoles, 28 de octubre de 2015

Todo sobre serial.print

Aprende todo lo que tiene que saber sobre Serial.print()



Las posibilidades que nos da el arduino son, desde encender un led, leer un sensor de humedad y temperatura, utilizar una pantalla lcd, comunicarnos a través de bluetooth con un dispostivo android, y así podríamos seguir hablando toda la tarde de todas las posibilidades que nos provee, pero además de esto tenemos que hablar algo más importante.
Hay que saber como mostrar esta información. Serial.print
Fuente: arduino.cc/en/Serial/Print

Comencemos, si el código esta en el setup()
void setup() {
  Serial.begin(9600);      
  Serial.print("Primero");
  Serial.println("Segundo");
}
void loop() {  
  
}




Si cambiamos el código del setup() al loop()
void setup() {
  Serial.begin(9600);     
}
void loop() {  
  Serial.print("Primero");
  Serial.println("Segundo");
}



En conclusión
  • Serial.print("primero") imprime primero,
  • Serial.println("segundo") impre segundo, a continuación de lo anterior, pero como tiene "ln" hace un salto de linea (enter)
  • Si ponemos el código en setup() lo imprime una sola vez
  • Si ponemos el código en loop() lo imprime infinita veces (justamente porque es un loop)
A pesar que estoy se ve bastante obvio, pero cuando queremos preguntarnos siempre antes de imprimir, cuantas veces queremos que se imprima/ejecute y ahí va a depender en donde vas a estar nuestro código.

De todas formas, dentro del loop() podemos tener condiciones if() y a pesar si se ejecuta infinita veces, puede que solo entre una sola vez por la condición if() entonces se imprimirá una sola vez. 
Ahí esta nuestra habilidad de ir jugando como y cuando queremos que se ejecuten las sentencias.

Sigamos con ejemplos
void setup() {
  Serial.begin(9600);
   
  Serial.println(78, BIN); //1001110
  Serial.println(78, OCT); //116
  Serial.println(78, DEC); //78
  Serial.println(78, HEX); //4E
  Serial.println(1.23456, 0);  //1
  Serial.println(1.23456, 2);  //1.23
  Serial.println(1.23456, 4);  //1.2346
}
void loop() {  
  
}


En conclusión la sintaxis
Serial.print(valor);
Serial.print(valor, formato);

El valor que le podemos ingresar es "cualquiera" por ejemplo en vez de mandar números enteros le voy a mandar un caracter, y el serial.print hace la conversión correspondiente

void setup() {
  Serial.begin(9600);
   
  Serial.println('a', BIN); 
  Serial.println('a', OCT); 
  Serial.println('a', DEC); 
  Serial.println('a', HEX); 
  Serial.println('a', 0);  
  Serial.println('a', 2);  
  Serial.println('a', 4);  
  Serial.println("");
  Serial.println('R', BIN); 
  Serial.println('R', OCT); 
  Serial.println('R', DEC); 
  Serial.println('R', HEX); 
  Serial.println('R', 0);  
  Serial.println('R', 2);  
  Serial.println('R', 4);  
}
void loop() {  
  
}


A este punto nos podremos preguntar para que nos puede servir saber el número binario del carácter de la letra 'a' ??. La repuesta viene ligada al almacenamiento optimo, por ejemplo si queremos almacenar el mínimo de despacio posible en la memoria EEPROM, debemos pensar en binario ya que esta memoria es muy muy pequeña y limitada.


Devuelve el número de bytes escritos, aunque la lectura de ese número es opcional


  •     size_t print(const __FlashStringHelper *);
  •     size_t print(const String &);
  •     size_t print(const char[]);
  •     size_t print(char);
  •     size_t print(unsigned char, int = DEC);
  •     size_t print(int, int = DEC);
  •     size_t print(unsigned int, int = DEC);
  •     size_t print(long, int = DEC);
  •     size_t print(unsigned long, int = DEC);
  •     size_t print(double, int = 2);
  •     size_t print(const Printable&);
  •     size_t println(const __FlashStringHelper *);
  •     size_t println(const String &s);
  •     size_t println(const char[]);
  •     size_t println(char);
  •     size_t println(unsigned char, int = DEC);
  •     size_t println(int, int = DEC);
  •     size_t println(unsigned int, int = DEC);
  •     size_t println(long, int = DEC);
  •     size_t println(unsigned long, int = DEC);
  •     size_t println(double, int = 2);
  •     size_t println(const Printable&);
  •     size_t println(void);
Fuente: Print.h

Espacios en blanco
Podemos ver que entre abc el \0 y "" no genera ningún espacio entre los tres caracteres
Serial.print('\0');
Serial.print("");

Incluso en C++ podemos ver lo siguiente 
char str[6] = "Hello\0"; // strlen(str) = 5, sizeof(str) = 6 (with one NUL)
char str[7] = "Hello\0"; // strlen(str) = 5, sizeof(str) = 7 (with two NULs)
char str[8] = "Hello\0"; // strlen(str) = 5, sizeof(str) = 8 (with three NULs per C99 6.7.8.21)
Fuente: stackoverflow

Serial.print("\t"); //Sirve para generar un espacio entre dos palabras, también llamado sangría

void setup() {
  Serial.begin(9600);
  Serial.print("hola");      
  Serial.print("\t");  
  Serial.print("chau");   
}

void loop() {  
  
}


Si queremos obtener valores aleatorios, podemos usar el siguiente código

void setup(){
Serial.begin(9600);    // configura el puerto serie a 9600bps
}

void loop(){
Serial.println(analogRead(0)); // envía valor analógico
delay(1000);     // espera 1 segundo
}


Fuente: playground

Serial.avaliable()
int Serial.avaliable()
Devuelve un entero con el número de bytes (carácteres) disponibles para leer desde el buffer serie, 0o 0 si no hay ninguno. si hay algún dato disponible, Serial.available() será mayor que 0. El buffer serie puede almacenar como máximo 128 bytes

Serial.read()
Lee o captura un byte (carácter) desde el puerto serie. Devuelvoe: El siguiente byte (carácter) desde el puerto serie, ó -1 si no hay ninguno.

Esto también lo utilizamos en el tutorial conexion-bluetooth-android-con-arduino donde el android le envía datos

Nota: En COM ingreso un valor y apreto enter, simulando el ingreso de información al arduino





6 comentarios:

  1. Gracias Por ese aporte,... tengo una pregunta, puedo utilizar o como puedo hacer para que pueda imprimir en una impresora normal de tinta por puerto serial o USB.. Gracias

    ResponderEliminar
  2. Hola en la opción dec es posible sacar los ceros a la izquieirda

    ResponderEliminar
  3. Excelente , aprendí mucho, lo aplique a un control de temperatura, solo ahora quiero hacer lo mismo pero a una pantalla TFT LCD

    ResponderEliminar
  4. Gracias por el aporte ,tenia algunas dudas de la comunicacion Serial
    Buen blog

    ResponderEliminar
  5. Amazing blog; I was confused about getting project opportunities as a front-end web developer. Your blog helped me locate these top sites, providing good development work. I also came across Eiliana.com it is a new platform that provides good development work. Have a look at that platform too.

    ResponderEliminar