Go Down

Topic: SOLUCIONADO extraer solo numeros de cadena de datos serial (Read 1 time) previous topic - next topic

park

Compañeros cada vez que presiono la tecla "D" en un teclado matricial capturo un dato de una cadena continua de datos seriales, la cual la separa un salto de linea, como puedo hacer para extraer solo los numeros incluyendo el punto de la cadena recibida.

La cadena que capturo al presionar el botón, es la siguiente, NT,GS   40.00 KG..solodeberia capturar 40.00.
Code: [Select]

String CapturaCadena;


void loop() {

    if(Serial.available()> 0){                     // Si hay algo en el puerto serial
  CapturaCadena = Serial.readStringUntil('\n');    //Guardamos el dato en un string
  }

 pulsacion = Teclado1.getKey();
 
 
switch (pulsacion) {

case '#':                       //Si se presiona #
  delay(30);
  Serial.println(CapturaCadena); //capturo el dato

  break;

}
}

Lucario448

La cadena que capturo al presionar el botón, es la siguiente, NT,GS   40.00 KG..solodeberia capturar 40.00.
El "formato" de la cadena es constante? Quiero decir: siempre empieza exactamente con "NT,GS   "?

park

No compañero, no siempre es constante, aveces es ST o GS

Lucario448

#3
Aug 02, 2016, 08:20 pm Last Edit: Aug 02, 2016, 08:22 pm by Lucario448
Bueno creo que no di la pregunta correcta; la redefiniré:

El primer dígito siempre estará en la misma posición de la cadena? (a eso me refería yo con "formato constante")
En tu ejemplo, el texto es así:

NT,GS   40.00 KG

Contando posiciones sería:

NT,GS   40.00 KG
012345678901

Visualizándolo de esta manera, ahora la pregunta sería:

El número siempre empezaría en la posición 7 y acabaría en el 11?

park

Empesaria en la posicion 7 pero no trminaria siempre en la posicion 11 ya que el numero podria ser de 0 hasta 100 000.00 o mas, y eso varia la posicion del digito final

Lucario448

Asumiendo que la cadena de caracteres siempre va a terminar en "KG", esta función debería servir:

Code: [Select]
String extraerNumero(String entrada) {
  byte posFinal = 8;
  char caracter;
  while (1) {
    caracter = entrada.charAt(posFinal);
    if (!isDigit(caracter) && !isPunct(caracter)) { // Si no es ni dígito ni signo de puntuación.
      // Suponiendo que la candena siempre acaba en "KG"; al llegar a la 'K', se termina la función.

      return entrada.substring(7, posFinal - 1); // Si no se le resta 1, se va la 'K' junto a la subcadena extraida.
    }
    posFinal++;
  }
}

Nótese que devuelve otro objeto String, así que no esperes hacer algo como:

Code: [Select]
int valor = extraerNumero(CapturaCadena);
Si más bien esa era la idea, solo habría que hacer unas ligeras modificaciones al código propuesto.

park

Muchas gracias compañero , me sirvio el codigo...ah tambien resolvi el mismo problema con este codigo..
Code: [Select]
if(Serial.available()> 0){                     // Si hay algo en el puerto serial
 // CapturaCadena = Serial.readStringUntil('\n');    //Guardamos el dato en un string

 char inChar = Serial.read();
    if (isDigit(inChar) || inChar == '.') { //comparo que solo sean digitos
      inString += inChar;
    }
    if (inChar == '\n') {
     // Serial.print("Peso, ");
      //Serial.println(inString.toFloat());
      numero = (inString.toFloat());
      // Borrar string
      inString = "";
      Serial.flush();
    }
  }
 

Go Up