Diferencia entre revisiones de «Serial.readStringUntil()»

De ArduWiki
Saltar a: navegación, buscar
(Referencias)
 
(No se muestran 8 ediciones intermedias de 2 usuarios)
Línea 1: Línea 1:
 
== Descripción ==
 
== Descripción ==
Lee los caracteres del buffer serie en una cadena. La función termina si se detecta el carácter terminador o si se cumple el tiempo de espera se ha alcanzado (ver [[Serial.setTimeout()]]).
+
Lee caracteres y los coloca en un [[String]]. La función termina si se ha encontrado el caracter terminador (no lo incluye en la lectura pero sí lo descarta del buffer de entrada del puerto), o el tiempo de espera (ver [[Serial.setTimeout()]]) se ha agotado.
 
 
Esta función es parte de la clase [[Stream]] y es llamada por cualquier clase que herede de ella ([[Wire]], [[Serial]], etc.).
 
  
 
== Sintaxis ==
 
== Sintaxis ==
Línea 10: Línea 8:
  
 
== Parametros ==
 
== Parametros ==
;caracter: Caracter a buscar debe ser tipo [[car]]
+
;caracter: el caracter terminador ([[char]]).
  
 
== Retorna ==
 
== Retorna ==
La cadena completa leída del buffer serie, hasta que se detecte el carácter terminador.
+
El objeto [[String]] resultante de la lectura.
 +
 
 +
== Comentario ==
 +
Esta función es parte de la clase [[Stream]] y se puede usar cualquier clase que herede de ella ([[Wire]], [[Serial]], etc.).
  
 
== Advertencias ==
 
== Advertencias ==
Nada.
+
* Hay un "bug" o fallo con esta función: si el flujo de entrada es constante (tiempo de espera nunca se agota) y nunca se encuentra el caracter terminador, se corre el riesgo de colgar completamente el programa. La razón se debe a que, conceptualmente, [[String]] es ilimitado en tamaño; pero como la [[SRAM]] no es así, eventualmente el programa llegará a colapsar.
 +
 
 +
== Ejemplo 1 ==
 +
<syntaxhighlight lang="c++">
 +
if (Serial.available()) {
 +
  Serial.print(F("Linea de texto leida: \""));
 +
  Serial.print(Serial.readStringUntil('\r')); // Ojo con el tamaño, que puede que de aquí no pase u ocurra comportamiento indefinido.
 +
  Serial.println('\"');
 +
  Serial.read(); // Descarta el '\n' que suele venir con el '\r'
 +
}
 +
</syntaxhighlight>
 +
 
 +
== Ejemplo 2 ==
 +
Es este ejemplo se lee el buffer hasta encontrar el CR+LF.
 +
 
 +
<syntaxhighlight lang="c++">
 +
void setup(){
 +
  Serial.begin(115200);
 +
}
 +
void loop(){
 +
  if (Serial.available()) {
 +
      Serial.println(Serial.readStringUntil("\r\n"));
 +
  }
 +
}
 +
</syntaxhighlight>
 +
 
 +
== Ejemplo 3 ==
 +
Es este ejemplo se lee el buffer hasta encontrar el el punto seguido.
  
== Ejemplo ==
 
 
<syntaxhighlight lang="c++">
 
<syntaxhighlight lang="c++">
 +
void setup(){
 +
  Serial.begin(115200);
 +
}
 +
void loop(){
 +
  if (Serial.available()) {
 +
      Serial.println(Serial.readStringUntil(". "));
 +
  }
 +
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
== Vea también ==
 
== Vea también ==
* [[Serial.begin()]]
+
<categorytree mode=all>Serial</categorytree>
* [[Serial.available()]]
 
* [[Serial.read()]]
 
* [[Serial.print()]]
 
* [[Serial.end()]]
 
  
 
== Referencias ==
 
== Referencias ==
* [http://manueldelgadocrespo.blogspot.com/p/readstringuntil.html Manuel Delgado Crespo]
+
* [http://manueldelgadocrespo.blogspot.com/p/readstringuntil.html readstringuntil()] - Manuel Delgado
  
[[Category:Funciones]]
+
[[Category:Serial]]

Revisión actual del 17:53 6 may 2019

Descripción

Lee caracteres y los coloca en un String. La función termina si se ha encontrado el caracter terminador (no lo incluye en la lectura pero sí lo descarta del buffer de entrada del puerto), o el tiempo de espera (ver Serial.setTimeout()) se ha agotado.

Sintaxis

Serial.readStringUntil(caracter);

Parametros

caracter
el caracter terminador (char).

Retorna

El objeto String resultante de la lectura.

Comentario

Esta función es parte de la clase Stream y se puede usar cualquier clase que herede de ella (Wire, Serial, etc.).

Advertencias

  • Hay un "bug" o fallo con esta función: si el flujo de entrada es constante (tiempo de espera nunca se agota) y nunca se encuentra el caracter terminador, se corre el riesgo de colgar completamente el programa. La razón se debe a que, conceptualmente, String es ilimitado en tamaño; pero como la SRAM no es así, eventualmente el programa llegará a colapsar.

Ejemplo 1

if (Serial.available()) {
   Serial.print(F("Linea de texto leida: \""));
   Serial.print(Serial.readStringUntil('\r')); // Ojo con el tamaño, que puede que de aquí no pase u ocurra comportamiento indefinido.
   Serial.println('\"');
   Serial.read(); // Descarta el '\n' que suele venir con el '\r'
}

Ejemplo 2

Es este ejemplo se lee el buffer hasta encontrar el CR+LF.

void setup(){
   Serial.begin(115200);
}
void loop(){
   if (Serial.available()) {
      Serial.println(Serial.readStringUntil("\r\n"));
   }
}

Ejemplo 3

Es este ejemplo se lee el buffer hasta encontrar el el punto seguido.

void setup(){
   Serial.begin(115200);
}
void loop(){
   if (Serial.available()) {
      Serial.println(Serial.readStringUntil(". "));
   }
}

Vea también


Referencias