Ayuda! Cadena de caracteres Arduino

saludos a la comunidad
estoy trabajando en un proyecto de un dataloger con una tarjeta mega un RTC y claro SD.
tengo el codigo para mandar datos seriales y que queden almacenados, ejemplo: si yo mando por serial algo como [1521.23] me crea el archivo .TXT y dentro de el escribe: [07/07/2014 12:53 Medición 1721.23 bla bla bla (mas cosas útiles)]

el problema viene cuando lo que recibo por serial es una cadena de caracteres tipo XXXDatoQueMeImportaXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*\r\n
mi pregunta es ¿como tomo solo ese dato de la cadena?

Hola.
Contrapregunta:
¿Cómo distingues tú el dato que te interesa en medio de la cadena?
Lo que se suele utilizar en los logs son, bien longitudes de datos fijas, con lo que sabes en qué posición están los caracteres a extraer, o bien utilizar un separador de datos y, además, si no sabes en qué posición correlativa está, un patrón que preceda al dato.
Por ejemplo, puedes utilizar comas para separar los datos y una letra que te indique qué dato viene. Por ejemplo:
t12.56,h1232,v11.75\n

El proceso sería:

  1. leo caracter.
  2. dependiendo del caracter leído, sé qué parámetro viene a continuación, y me dispongo a leerlo.
  3. Con parseint (o parsefloat si es flotante) leo el dato numérico. El comando va a leer hasta que se encuentre un carácter no numérico (coma o salto de línea).
  4. vuelta a comenzar.

Es una idea básica, pero creo que te puede dar alguna idea de cómo comenzar a planificarlo.
Saludos.

hola
mira la cadena no la puedo cambiar, ese es el reto jaja
y mi dato va algo asi XXXH2S=_____ppmXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*\r\n
son solo numeros los que me interesan, pero en la cadena hay mas datos similares como por ejemplo
XXXH2S=ppmCH4=%NH3=_____ppmY así continua y finaliza la cadena con un *\r\n
yo solo quiero el dato de H2S esos 5 caracteres que podrian ser en formato 1.234 ó 12.34
espero su ayuda gracias

Hola.
¿La cadena es un char *, un objeto string, o tan solo quieres extraer ese dato y desechar el resto mientras la recibes por serial?

hola
solo quería ese dato o bueno también algún otro como un fecha que viene también en el dato
puse a trabajar mi cerebro y llegue a esto, no se si sea lo mas correcto o sencillo pero funciona
obtengo el valor de entre un = y una p

int numChar = 0;
char incomingByte = 0;
int cantPalabras = 1;
String palabra1 = "";
String palabra2 = "";
String palabra3 = "";

void setup() {
Serial.begin(9600);
}

void loop(){
while (Serial.available()>0){
numChar = Serial.read();
incomingByte = numChar;
if (numChar==61){ //61 representa el = que va andes del dato
cantPalabras++;
}
if (numChar==112){ //112 = p que separa el dato ppm
cantPalabras++;
}
if (numChar!=13 && numChar!=10 && numChar!=61 && numChar!=112){
if(cantPalabras==1){
palabra1 = palabra1+incomingByte;
}
if(cantPalabras==2){
palabra2 = palabra2+incomingByte;
}
if(numChar==42){//42 es * representa final de cadena
Serial.println(palabra2);
palabra1 = "";
palabra2 = "";
cantPalabras = 1;
Serial.flush();
}
}
}
}

Hola.
Si funciona, eso es en principio lo importante, así que tu enfoque es válido.
Uno un poco más "estándar" sería recibir toda la cadena agregándola en un String cadenarecibida (hasta recibir el \r) y después analizar el string, buscando el patrón "H2S=":

int encontrado=cadenarecibida.indexOf("H2S="); // si encuentra en la cadena, indexOf nos dice en qué posición
if (encontrado>=0) // indexOf devuelve -1 si no se encontró coincidencia
    subcadena1=cadenarecibida.subString(encontrado+4,encontrado+9); // extraemos la subcadena entre 4 y 9 caracteres a partir de donde comienza "H2S="

Echa un vistazo a las funciones indexOf y subString en la referencia.
Saludos.

gracias por la ayuda :slight_smile: