Diferencia entre revisiones de «Serial.print()»

De ArduWiki
Saltar a: navegación, buscar
(Ejemplo 1)
(Referencias)
 
(No se muestran 36 ediciones intermedias de 2 usuarios)
Línea 1: Línea 1:
 
== Descripción ==
 
== Descripción ==
Vuelca o envía un dato (variable, número o cadena), al puerto serie. Dicho comando puede tomar diferentes formas, dependiendo de los parámetros que usemos para definir el formato de volcado de los datos.
+
Vuelca o envía un dato (variable, número o cadena), al puerto serie; lo hace mediante la representación textual de su valor. Dicho comando puede tomar diferentes formas, dependiendo de los parámetros que usemos para definir el formato de volcado de los datos.
  
 
== Sintaxis ==
 
== Sintaxis ==
 
<pre>
 
<pre>
 +
Serial.print("texto a mostrar");
 
Serial.print(variable [,formato]);
 
Serial.print(variable [,formato]);
 +
Serial.print(variable [,decimales]);
 
</pre>
 
</pre>
  
== Parametros ==
+
== Parámetros ==
;Variable: variable a evaluar.
+
;Variable: variable a evaluar. Esta variable puede ser de cualquier tipo.
;formato: por defecto es DEC, pero puedes también usar HEX, OCT o BIN.
+
;formato: por defecto es DEC, pero puedes también usar [[DEC / BIN / HEX / OCT|HEX, OCT o BIN]].
 +
;digitos: si la variable es tipo [[float]] o [[double]] se puede especificar el numero de decimales.
 +
 
 +
== Retorna ==
 +
size_t ([[long]]):print() devuelve el número de bytes escritos, aunque leer ese número es opcional.
  
 
== Advertencias ==
 
== Advertencias ==
Nada.
+
* Es posible que '''print()''' muestre varios valores al mismo tiempo pero estos deben ser [[suma|concatenados]] en una variable [[String]] previamente. Ver ejemplo 2.
  
 
== Comentarios ==
 
== Comentarios ==
Línea 19: Línea 25:
 
{| class="wikitable col1cen"
 
{| class="wikitable col1cen"
 
|+Codigos de escape
 
|+Codigos de escape
!Código!!Descripción
+
!Código!!Descripción!!ASCII!!DEC
 
|-
 
|-
|\n||nueva línea
+
|\n||nueva línea||LF||10
 
|-
 
|-
|\r||retorno de carro
+
|\r||retorno de carro||CR||13
 
|-
 
|-
|\t||lengüeta
+
|\t||tabulacion horizontal||HT||9
 
|-
 
|-
|\v||pestaña vertical
+
|\v||tabulacion vertical||VT||11
 
|-
 
|-
|\b||retroceso
+
|\b||retroceso||BS||8
 
|-
 
|-
|\f||alimentación de formulario (alimentación de página)
+
|\f||salto de página||FF||12
 
|-
 
|-
|\a||alerta (pitido)
+
|\a||alerta (pitido)||BELL||7
 
|-
 
|-
|\'||comilla simple ( ')
+
|\'||comilla simple||'||39
 
|-
 
|-
|\"||comillas dobles ( ")
+
|\"||comillas dobles||"||34
 
|-
 
|-
|\?||signo de interrogación ( ?)
+
|\?||signo de interrogación||?||63
 
|-
 
|-
|\\||barra invertida ( \)
+
|\\||barra invertida||\||47
 
|}
 
|}
  
 
== Ejemplo 1 ==
 
== Ejemplo 1 ==
Observa la diferencia sustancial entre usar [[Serial.write()]] y '''print()'''
+
Observa que <b>no hay diferencia</b> entre usar [[Serial.write()]] y '''print()''' para un [[char]].
  
 
<syntaxhighlight lang="c++">
 
<syntaxhighlight lang="c++">
byte c = 'A';          //Serial lo mismo que c = 65
+
char c = 'A';          //Serial lo mismo que c = 65
Serial.write(c);      //A  ***ojo al piojo***
+
Serial.write(c);      //A
Serial.print(c);      //65
+
Serial.print(c);      //A
 +
Serial.print(c, DEC);  //65
 +
Serial.print(c, HEX);  //41
 +
Serial.print(c, OCT);  //101
 +
Serial.print(c, BIN);  //01000001
 +
 
 +
Serial.print('L', DEC)  //76
 +
Serial.print(76, HEX)  //4C
 +
Serial.print(76, OCT)  //114
 +
Serial.print(76, BIN)   //01001100
 +
</syntaxhighlight>
 +
 
 +
== Ejemplo 2 ==
 +
Observa la <b>diferencia sustancial</b> entre usar [[Serial.write()]] y '''print()''' para un [[byte]].
 +
 
 +
<syntaxhighlight lang="c++">
 +
byte c = 'A';          //Seria lo mismo con c = 65
 +
Serial.write(c);      //A
 +
Serial.print(c);      //65   ***ojo al piojo***
 
Serial.print(c, DEC);  //65
 
Serial.print(c, DEC);  //65
 
Serial.print(c, HEX);  //41
 
Serial.print(c, HEX);  //41
Línea 57: Línea 81:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Ejemplo 2 ==
+
== Ejemplo 3 ==
 
En este ejemplo demostramos que a una cadena se le puede '''concatenar''' un numero sin problemas.
 
En este ejemplo demostramos que a una cadena se le puede '''concatenar''' un numero sin problemas.
 +
 
<syntaxhighlight lang="c++">
 
<syntaxhighlight lang="c++">
 
Serial.print("Sensor: " + analogReda(A0));  //No muestra nada
 
Serial.print("Sensor: " + analogReda(A0));  //No muestra nada
Línea 67: Línea 92:
  
 
String sensor = "Sensor: ";
 
String sensor = "Sensor: ";
sensor = sensor + analogRead(A0);
+
sensor = sensor + analogRead(A0);            //También puedes usar sensor.concat(analogRead(A0));
 
Serial.print(sensor);                        //Ok
 
Serial.print(sensor);                        //Ok
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Vea tambien ==
+
== Ejemplo 4 ==
* [[Serial]]
+
Aquí un ejemplo mas completo para dejar clara la diferencia entre [[Serial.write()]], '''Serial.print()''' y [[Serial.println()]]
* [[Serial.begin()]]
+
 
* [[Serial.available()]]
+
<syntaxhighlight lang="c++">
* [[Serial.read()]]
+
void setup() {
* [[Serial.println()]]
+
  Serial.begin(9600);
* [[F()]]
+
  Serial.println("*** Estamos listo ***");
* [[Serial.end()]]
+
}
 +
 
 +
void loop() {
 +
  if (Serial.available()){
 +
      byte ent = Serial.read();
 +
      Serial.print("El caracter enviado fue: ");
 +
      Serial.write(ent);
 +
      Serial.print(" y su codigo ASCCI es: ");
 +
      Serial.print(ent);
 +
      Serial.print(" en HEXADECIMAL es: ");
 +
      Serial.print(ent, HEX);
 +
  }
 +
}
 +
</syntaxhighlight>
 +
 
 +
== Ejemplo 5 ==
 +
Puede pasar cadenas almacenadas en memoria [[flash]] a '''Serial.print()''' envolviéndolas con el macro [[F()]].
 +
 
 +
<syntaxhighlight lang="c++">
 +
Serial.print(F("Apuntes de Arduino"));
 +
</syntaxhighlight>
 +
 
 +
{{Tip|Esto es muy útil cuando se tiene que enviar gran cantidad de texto que de otro modo usaría mucha [[SRAM]].}}
 +
 
 +
== Ejemplo 6 ==
 +
Si tienes un [[float]] o un [[double]] puedes especificar el numero de decimales.
 +
 
 +
<syntaxhighlight lang="c++">
 +
Serial.println(PI, 2);  //3.14
 +
Serial.println(PI, 6);  //3.141593
 +
</syntaxhighlight>
 +
 
 +
== Ejemplo 7 ==
 +
Podemos usar la [[Asignación condicional]] dentro de print()
 +
 
 +
<syntaxhighlight lang="c++">
 +
void setup(){
 +
  Serial.begin(9600);
 +
  for (byte n=2; n<14; n++){
 +
      pinMode(n, INPUT);
 +
  }
 +
}
 +
void loop(){
 +
  for (byte n=2; n<14; n++){
 +
      Serial.print(n);
 +
      Serial.print(" = ");
 +
      Serial.println(digitalRead(n)?"Prendido":"Apagado");
 +
  }
 +
  Serial.println("---------");
 +
  delay(1000);
 +
}
 +
</syntaxhighlight>
 +
 
 +
== Vea también ==
 +
<categorytree mode=all>Serial</categorytree>
  
 
== Referencias ==
 
== Referencias ==
 +
* [https://aprendiendoarduino.wordpress.com/tag/comunicacion-serie/ Comunicación serie] - Enrique Crespo
 +
* [https://arduino.stackexchange.com/questions/10088/what-is-the-difference-between-serial-write-and-serial-print-and-when-are-they Difference between serial write and serial print] - Stack Exchange
  
[[Category:Funciones]]
+
[[Category:Serial]]

Revisión actual del 00:07 19 jul 2019

Descripción

Vuelca o envía un dato (variable, número o cadena), al puerto serie; lo hace mediante la representación textual de su valor. Dicho comando puede tomar diferentes formas, dependiendo de los parámetros que usemos para definir el formato de volcado de los datos.

Sintaxis

Serial.print("texto a mostrar");
Serial.print(variable [,formato]);
Serial.print(variable [,decimales]);

Parámetros

Variable
variable a evaluar. Esta variable puede ser de cualquier tipo.
formato
por defecto es DEC, pero puedes también usar HEX, OCT o BIN.
digitos
si la variable es tipo float o double se puede especificar el numero de decimales.

Retorna

size_t (long):print() devuelve el número de bytes escritos, aunque leer ese número es opcional.

Advertencias

  • Es posible que print() muestre varios valores al mismo tiempo pero estos deben ser concatenados en una variable String previamente. Ver ejemplo 2.

Comentarios

Los literales de caracteres y cadenas también pueden representar caracteres especiales que son difíciles o imposibles de expresar de otra manera en el código fuente de un programa, como "nueva linea" (\n) o "tab" (\t). Estos caracteres especiales son todos precedidos por un carácter de barra diagonal inversa (\).

Codigos de escape
Código Descripción ASCII DEC
\n nueva línea LF 10
\r retorno de carro CR 13
\t tabulacion horizontal HT 9
\v tabulacion vertical VT 11
\b retroceso BS 8
\f salto de página FF 12
\a alerta (pitido) BELL 7
\' comilla simple ' 39
\" comillas dobles " 34
\? signo de interrogación ? 63
\\ barra invertida \ 47

Ejemplo 1

Observa que no hay diferencia entre usar Serial.write() y print() para un char.

char c = 'A';          //Serial lo mismo que c = 65
Serial.write(c);       //A
Serial.print(c);       //A
Serial.print(c, DEC);  //65
Serial.print(c, HEX);  //41
Serial.print(c, OCT);  //101
Serial.print(c, BIN);  //01000001

Serial.print('L', DEC)  //76
Serial.print(76, HEX)   //4C
Serial.print(76, OCT)   //114
Serial.print(76, BIN)   //01001100

Ejemplo 2

Observa la diferencia sustancial entre usar Serial.write() y print() para un byte.

byte c = 'A';          //Seria lo mismo con c = 65
Serial.write(c);       //A
Serial.print(c);       //65   ***ojo al piojo***
Serial.print(c, DEC);  //65
Serial.print(c, HEX);  //41
Serial.print(c, OCT);  //101
Serial.print(c, BIN);  //1000001

Ejemplo 3

En este ejemplo demostramos que a una cadena se le puede concatenar un numero sin problemas.

Serial.print("Sensor: " + analogReda(A0));   //No muestra nada

int sensor = analogRead(A0);
sensor = "Sensor: "+ sensor;
Serial.print(sensor);                        //Solo sale valor de analogRead(A0)

String sensor = "Sensor: ";
sensor = sensor + analogRead(A0);            //También puedes usar sensor.concat(analogRead(A0));
Serial.print(sensor);                        //Ok

Ejemplo 4

Aquí un ejemplo mas completo para dejar clara la diferencia entre Serial.write(), Serial.print() y Serial.println()

void setup() {
   Serial.begin(9600);
   Serial.println("*** Estamos listo ***");
}

void loop() {
   if (Serial.available()){
      byte ent = Serial.read();
      Serial.print("El caracter enviado fue: ");
      Serial.write(ent);
      Serial.print(" y su codigo ASCCI es: ");
      Serial.print(ent);
      Serial.print(" en HEXADECIMAL es: ");
      Serial.print(ent, HEX);
   }
}

Ejemplo 5

Puede pasar cadenas almacenadas en memoria flash a Serial.print() envolviéndolas con el macro F().

Serial.print(F("Apuntes de Arduino"));

Tip: Esto es muy útil cuando se tiene que enviar gran cantidad de texto que de otro modo usaría mucha SRAM.


Ejemplo 6

Si tienes un float o un double puedes especificar el numero de decimales.

Serial.println(PI, 2);   //3.14
Serial.println(PI, 6);   //3.141593

Ejemplo 7

Podemos usar la Asignación condicional dentro de print()

void setup(){
   Serial.begin(9600);
   for (byte n=2; n<14; n++){
      pinMode(n, INPUT);
   }
}
void loop(){
   for (byte n=2; n<14; n++){
      Serial.print(n);
      Serial.print(" = ");
      Serial.println(digitalRead(n)?"Prendido":"Apagado");
   }
   Serial.println("---------");
   delay(1000);
}

Vea también


Referencias