Diferencia entre revisiones de «Serial.read()»
(→Ejemplo 5) |
|||
(No se muestran 36 ediciones intermedias de 2 usuarios) | |||
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> | ||
− | + | 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 == | ||
− | + | 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 == | == 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. | ||
+ | |||
+ | <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. | ||
− | |||
<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()){ | ||
− | + | String data = Serial.readStringUntil('\n'); | |
− | + | Serial.println(data); | |
− | Serial.println( | ||
} | } | ||
+ | } | ||
+ | </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 == | ||
− | + | <categorytree mode=all>Serial</categorytree> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
== 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: | + | [[Category:Serial]] |
Revisión actual del 15:31 21 sep 2019
Contenido
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
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
- Seril.print() - Referencias Arduino
- Comunicacion serie - Enrique Crespo
- Cadena de texto por puerto serie - Luis Llamas
- Matriz por puerto serie - Luis Llamas
- Serial.print() - Manuel Delgado
- Serial print - HetPRO
- Serial.print() - Curso sobre Arduino MEGA
- Difference between Serial.print() and Seria.write() - Stack Exchange