Go Down

Topic: Ayuda! Cadena de caracteres Arduino (Read 2919 times) previous topic - next topic

Aaron_loor

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?

noter

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.

Aaron_loor

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

noter

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?

Aaron_loor

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
Quote

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();
            }
        } 
    }     



noter

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=":
Code: [Select]
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.

Aaron_loor


Go Up