Diferencia entre revisiones de «Serial.read()»

De ArduWiki
Saltar a: navegación, buscar
(Ejemplo 5)
 
(No se muestran 33 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
 
== Descripción ==
 
== Descripción ==
 
Lee o captura un byte (un carácter) desde el puerto serie.
 
Lee o captura un byte (un carácter) desde el puerto serie.
 +
 +
{{Nota|Lo que lee es un caracter en codigo ASCII.}}
  
 
== Sintaxis ==
 
== Sintaxis ==
 
<pre>
 
<pre>
byte variable = Serial.read();
+
char variable = Serial.read();
 
</pre>
 
</pre>
  
 
== Parametros ==
 
== Parametros ==
;variable: variable para capturar byte de entrada
+
;variable: variable para capturar [[char]] o [[byte]] de entrada. Cuidado no es lo mismo ver ejemplos 1 y 2.
  
 
== Retorno ==
 
== Retorno ==
Línea 15: Línea 17:
 
== Advertencia ==
 
== Advertencia ==
 
* Si por error no se verifica de antemano si hay datos disponibles, '''read()''' retornará 255 para [[byte]] en el caso que el valor real sea -1 (nada).
 
* Si por error no se verifica de antemano si hay datos disponibles, '''read()''' retornará 255 para [[byte]] en el caso que el valor real sea -1 (nada).
 +
* El buffer en el caso de [[UNO]] y [[NANO]] es de 64 kB. Aunque esto se puede cambiar con la libreria '''HardwareSerial.h'''.
 +
* El monitor serie '''nunca''' añade a la cadena escrita CR (\n) ni LF (\n) si haces un simple '''Enter'''. No asi si lo escribes en un block de notas y lo copias en la linea de envio.
 +
 +
== Ejemplo 1 ==
 +
En este primer ejemplo usamos una variable tipo [[char]] para capturar el caracter.
 +
 +
<syntaxhighlight lang="c++">
 +
void setup(){
 +
  Serial.begin(9600);
 +
}
 +
void loop(){
 +
  if (Serial.available()){        //Espera carácter
 +
      char car = Serial.read();    //Lee carácter enviado y lo borra del buffer
 +
      Serial.println(car);        //Imprime carácter enviado
 +
  }
 +
}
 +
</syntaxhighlight>
 +
 +
Si envias A se imprime A, si envias 1 se imprime 1.
 +
 +
== Ejemplo 2 ==
 +
En este segundo ejemplo usamos una variable tipo [[byte]] para capturar carácter.
  
== Ejemplo ==
 
 
<syntaxhighlight lang="c++">
 
<syntaxhighlight lang="c++">
 
void setup(){
 
void setup(){
 
   Serial.begin(9600);
 
   Serial.begin(9600);
 
}
 
}
 +
void loop(){
 +
  if (Serial.available()){        //Espera carácter
 +
      byte car = Serial.read();    //Lee carácter enviado y lo borra del buffer
 +
      Serial.write(car);          //Imprime carácter enviado
 +
      Serial.print(" = ");
 +
      Serial.println(car);        //Imprime código ASCII carácter enviado
 +
  }
 +
}
 +
</syntaxhighlight>
 +
 +
Si envias A se imprime 65, si envias 1 se imprime 49.
 +
 +
{{Tip|Nota que la única diferencia es que en el ejemplo 1 capturamos como [[char]] y en el segundo ejemplo como [[byte]].}}
 +
 +
== Ejemplo 3 ==
 +
En este ejemplo capturaremos varios caracteres y los almacenamos uno a uno en una variable tipo [[String]].
 +
 +
<syntaxhighlight lang="c++">
 +
String frase = "";
 +
 +
void setup(){
 +
  Serial.begin(9600);
 +
}
 +
 +
void loop(){
 +
  while (Serial.available()){
 +
      char caracter = Serial.read();
 +
      frase.concat(caracter);
 +
      delay(10);
 +
  }
 +
  if (frase != ""){
 +
      Serial.println(frase);
 +
      frase = "";
 +
  }
 +
}
 +
</syntaxhighlight>
 +
 +
== Ejemplo 4 ==
 +
Este ejemplo recibe una matriz de [[int]]s.
 +
 +
<syntaxhighlight lang="c++">
 +
int datos[10];
 +
 +
void setup(){
 +
  Serial.begin(9600);
 +
}
 +
 +
void loop(){ 
 +
  if (Serial.available() >= 10 * sizeof(datos[0])){
 +
      Serial.readBytes((byte*)datos, 10 * sizeof(datos[0]));
 +
  }
 +
}
 +
</syntaxhighlight>
 +
 +
== Ejemplo 5 ==
 +
Mucha gente intenta probar este código enviando datos por el monitor serie y no le funciona, porque el '''Enter''' del monitor serie ejecuta la acción de enviar sin introducir los códigos [[ASCII table|ASCII]] CR (\r) ni LF (\n).
 +
 +
<syntaxhighlight lang="c++">
 +
void setup(){
 +
  Serial.begin(9600);
 +
}
 +
 
void loop(){
 
void loop(){
 
   if (Serial.available()){
 
   if (Serial.available()){
       byte car = Serial.read();   //Lee caracter enviado y borra del buffer
+
       String data = Serial.readStringUntil('\n');
      Serial.write(car);          //Imprime caracter enviado
+
       Serial.println(data);
       Serial.println(car);         //Impime codigo ASCII caracter enviado
 
 
   }
 
   }
 +
}
 +
</syntaxhighlight>
 +
 +
{{Nota|Para que te funcione este código escribe algo y le das enter (CR) en un Notepad++ por ejemplo y luego copia esa cadena completa y la pegas en el monitor serie y envías.}}
 +
 +
== Ejemplo 6 ==
 +
Si leemos el buffer vacio notamos que la respuesta en -1.
 +
 +
<syntaxhighlight lang="c++">
 +
void setup(){
 +
  Serial.begin(9600);
 +
  delay(1000);
 +
  Serial.println(Serial.read());
 +
}
 +
void loop(){
 +
  //Nada
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
== Vea también ==
 
== Vea también ==
* [[Serial]]
+
<categorytree mode=all>Serial</categorytree>
* [[Serial.begin()]]
 
* [[Serial.peek()]]
 
* [[Serial.available()]]
 
* [[Serial.print()]]
 
* [[Serial.println()]]
 
* [[Serial.write()]]
 
* [[Serial.end()]]
 
  
 
== Referencias ==
 
== Referencias ==
 +
* [https://www.arduino.cc/reference/en/language/functions/communication/serial/print/ Seril.print()] - Referencias Arduino
 +
* [https://aprendiendoarduino.wordpress.com/tag/comunicacion-serie/ Comunicacion serie] - Enrique Crespo
 +
* [https://www.luisllamas.es/cadenas-de-texto-puerto-serie-arduino/ Cadena de texto por puerto serie] - Luis Llamas
 +
* [https://www.luisllamas.es/array-puerto-serie-arduino/ Matriz por puerto serie] - Luis Llamas
 +
* [http://manueldelgadocrespo.blogspot.com/p/serialprint.html Serial.print()] - Manuel Delgado
 +
* [https://hetpro-store.com/TUTORIALES/arduino-serial-print/ Serial print] - HetPRO
 +
* [http://cursoarduinomega.blogspot.com/2015/10/todo-sobre-serialprint.html Serial.print()] - Curso sobre Arduino MEGA
 +
* [https://arduino.stackexchange.com/questions/10088/what-is-the-difference-between-serial-write-and-serial-print-and-when-are-they Difference between Serial.print() and Seria.write()] - Stack Exchange
  
[[Category:Funciones]]
+
[[Category:Serial]]

Revisión actual del 15:31 21 sep 2019

Descripción

Lee o captura un byte (un carácter) desde el puerto serie.

Nota: Lo que lee es un caracter en codigo ASCII.


Sintaxis

char variable = Serial.read();

Parametros

variable
variable para capturar char o byte de entrada. Cuidado no es lo mismo ver ejemplos 1 y 2.

Retorno

El valor recuperado según el número de bits de datos configurado, o -1 si el buffer de entrada está vacío (int).

Advertencia

  • Si por error no se verifica de antemano si hay datos disponibles, read() retornará 255 para byte en el caso que el valor real sea -1 (nada).
  • El buffer en el caso de UNO y NANO es de 64 kB. Aunque esto se puede cambiar con la libreria HardwareSerial.h.
  • El monitor serie nunca añade a la cadena escrita CR (\n) ni LF (\n) si haces un simple Enter. No asi si lo escribes en un block de notas y lo copias en la linea de envio.

Ejemplo 1

En este primer ejemplo usamos una variable tipo char para capturar el caracter.

void setup(){
   Serial.begin(9600);
}
void loop(){
   if (Serial.available()){        //Espera carácter
      char car = Serial.read();    //Lee carácter enviado y lo borra del buffer
      Serial.println(car);         //Imprime carácter enviado
   }
}

Si envias A se imprime A, si envias 1 se imprime 1.

Ejemplo 2

En este segundo ejemplo usamos una variable tipo byte para capturar carácter.

void setup(){
   Serial.begin(9600);
}
void loop(){
   if (Serial.available()){        //Espera carácter
      byte car = Serial.read();    //Lee carácter enviado y lo borra del buffer
      Serial.write(car);           //Imprime carácter enviado
      Serial.print(" = ");
      Serial.println(car);         //Imprime código ASCII carácter enviado
   }
}

Si envias A se imprime 65, si envias 1 se imprime 49.

Tip: Nota que la única diferencia es que en el ejemplo 1 capturamos como char y en el segundo ejemplo como byte.


Ejemplo 3

En este ejemplo capturaremos varios caracteres y los almacenamos uno a uno en una variable tipo String.

String frase = "";
 
void setup(){
   Serial.begin(9600);
}
 
void loop(){
   while (Serial.available()){
      char caracter = Serial.read();
      frase.concat(caracter);
      delay(10);
   }
   if (frase != ""){
      Serial.println(frase);
      frase = "";
   }
}

Ejemplo 4

Este ejemplo recibe una matriz de ints.

int datos[10];
 
void setup(){
   Serial.begin(9600);
} 
 
void loop(){   
   if (Serial.available() >= 10 * sizeof(datos[0])){
      Serial.readBytes((byte*)datos, 10 * sizeof(datos[0]));
   }
}

Ejemplo 5

Mucha gente intenta probar este código enviando datos por el monitor serie y no le funciona, porque el Enter del monitor serie ejecuta la acción de enviar sin introducir los códigos ASCII CR (\r) ni LF (\n).

void setup(){
   Serial.begin(9600);
}
 
void loop(){
   if (Serial.available()){
      String data = Serial.readStringUntil('\n');
      Serial.println(data);
   }
}

Nota: Para que te funcione este código escribe algo y le das enter (CR) en un Notepad++ por ejemplo y luego copia esa cadena completa y la pegas en el monitor serie y envías.


Ejemplo 6

Si leemos el buffer vacio notamos que la respuesta en -1.

void setup(){
   Serial.begin(9600);
   delay(1000);
   Serial.println(Serial.read());
}
void loop(){
   //Nada
}

Vea también


Referencias