funcion atoi () y valor del Serial.println

Hola,

a ver si podeis echarme un cable. Os cuento:

Recibiendo a través del módulo ESP8266, mi Arduino YUN recoge una cadena de chars en ascii a través del buffer que quiero pasar a int para operar con ellos.

Accedo a una URL donde tengo un tag tal que así. "

17

" y necesito:

1.Filtrar los numeros de los demás carácteres.
2.Convertir esos números a un int

Por ahora estoy utilizando la funcion atoi().

char cadena[9]; //Creamos un array que almacenará los caracteres que escribiremos en la consola del PC. Le asignamos  un tope de caracteres, en este caso 30
byte posicion=0;  //Variable para cambiar la posición de los caracteres del array
int valor;

memset(cadena, 0,sizeof(cadena));//memset borra el contenido del array  "cadena" desde la posición 0 hasta el final sizeof
 
    while(p.available()>0) //Mientras haya datos en el buffer ejecuta la función
    {
      delay(5); //Poner un pequeño delay para mejorar la recepción de datos  
      cadena[posicion]=p.read();//Lee un carácter del string "cadena" de la "posicion", luego lee el siguiente carácter con "posicion++"
      posicion++;
    }
 
    valor=atoi(cadena);//Convertimos la cadena de caracteres en enteros
    Serial.println(valor);//Imprimimos el valor
    posicion=0;//Ponemos la posicion a 0

    a=0;
    return(c);
  } }

Pero cuando imprimo el valor por la consola serie me aparece esto:

0
0
0
1
7
0
0
0
0
(en diferentes lineas)

mis dudas son:

Ahora mismo cuanto vale la variable valor? 17? entonces porque me muestra esos 0? y por que de ese salto de linia en vez de escribir el 17? ya puedo operar con esa variable int?
:confused: :confused: :confused:

Muchas gracias de antemano!!

captura.JPG

¿ Podrias darnos mas datos ?, como por ejemplo la velocidad del Serial, el tamaño maximo del string que esperas recibir, y en lugar de la imagen que adjuntas y que no aporta nada de informacion, el codigo fuente del sketch.

No he copiado todo el código porque creía que habia lo suficiente en ese trozo, lo siento.

#include <Esplora.h>
#include <stdio.h>      /* printf, fgets */
#include <stdlib.h>     /* atoi */
#include <Process.h>
char cadena[9]; //Creamos un array que almacenará los caracteres que escribiremos en la consola del PC. Le asignamos  un tope de caracteres, en este caso 30
byte posicion=0;  //Variable para cambiar la posición de los caracteres del array
int valor;
void setup() {
  // Initialize Bridge
  Bridge.begin();

  // Initialize Serial
  Serial.begin(9600);

  // Wait until a Serial Monitor is connected.
  while (!Serial);

  // run various example processes
  
}

void loop() {
  char zona1= runCurl();
//  char zona2= a();
   Serial.print("plazas z1");
 Serial.print("\n");
 Serial.print(zona1);
 Serial.print("\n");
  Serial.print("plazas z2");
 Serial.print("\n");
// Serial.print(zona2);
 Serial.print("\n");
 int plaZ1=  zona1 - '0';
// int plaZ2=  zona2 - '0';
// int platotals = plaZ1+plaZ2;
 Serial.print("plazas totales z1+z2");
 Serial.print("\n");
// Serial.print(platotals);
 Serial.print("\n");
  delay (3000);
}

char runCurl() {
  // Launch "curl" command and get Arduino ascii art logo from the network
  // curl is command line program for transferring data using different internet protocols
 int a=1;
 char c[9];
 String dato1;
 String dato2;
 int i=0;
 char leido;
 if (a=1) 
 {
  Process p;        // Create a process and call it "p"
  p.begin("curl");  // Process that launch the "curl" command
  p.addParameter("192.168.1.54"); // Add the URL parameter to "curl"
  p.run();      // Run the process and wait for its termination

  // Print arduino over the Serial
  // A process output can be read with the stream methods
 
    memset(cadena, 0,sizeof(cadena));//memset borra el contenido del array  "cadena" desde la posición 0 hasta el final sizeof
 
    while(p.available()>0) //Mientras haya datos en el buffer ejecuta la función
    {
      delay(5); //Poner un pequeño delay para mejorar la recepción de datos  
      cadena[posicion]=p.read();//Lee un carácter del string "cadena" de la "posicion", luego lee el siguiente carácter con "posicion++"
      posicion++;
    
 
    valor=atoi(cadena);//Convertimos la cadena de caracteres en enteros
    Serial.println(valor);//Imprimimos el valor sumandole un valor +2
    posicion=0;//Ponemos la posicion a 0
 
    
   
    //Serial.print("\r\n");
    
  // Ensure the last bit of data is sent.
 // Serial.flush();
    }a=0;return(c);
  } }
 char a(){ 
    char c;
    Process a;        // Create a process and call it "p"
  a.begin("curl");  // Process that launch the "curl" command
  a.addParameter("192.168.1.50"); // Add the URL parameter to "curl"
  a.run();      // Run the process and wait for its termination

  // Print arduino over the Serial
  // A process output can be read with the stream methods
  while (a.available()>0) 
    {
     c = a.read();
    Serial.print("counter z2");
    Serial.print("\n");
    Serial.print(c);
    }
  // Ensure the last bit of data is sent.
  Serial.flush();
  return(c);
  }
 //}

Falta borrar alguna variable que no se utiliza, o la segunda funcion que no llamo, y prints para debugar. Pero el código es este.

-La “cadena[9]” tiene 9 posiciones. Son suficientes para obtener dos dígitos no?
-el serial va a 9600.
-El tamaño máximo no creo que sobrepase los 9 carácteres

digito1digito2

y en realidad los tags son desechables al final.

Muchas gracias de nuevo Alfaville

Hola de nuevo.

A falta de mas detalle en el análisis, empezaria con esta prueba en el trozo de código que pusiste primero:

char cadena[9]; //Creamos un array que almacenará los caracteres que escribiremos en la consola del PC. Le asignamos  un tope de caracteres, en este caso 30
byte posicion=0;  //Variable para cambiar la posición de los caracteres del array
int valor;
char caracter;  // -----<< NUEVO >>-----

//memset(cadena, 0,sizeof(cadena));//memset borra el contenido del array  "cadena" desde la posición 0 hasta el final sizeof
 
    while(p.available()>0) //Mientras haya datos en el buffer ejecuta la función
    {
 caracter=p.read();  //Lee un carácter del string "cadena" de la "posicion", luego lee el siguiente carácter con "posicion++"
 if((caracter>='0')&&(caracter<='9'))   // Filtramos solo numeros SIN SIGNO ni COMAS
 {
 cadena[posicion]=caracter;   // Guarda caracter
 }
 posicion++;
 delay(5); // Haz pruebas con el delay
    }
 
 cadena[posicion]=0;
    valor=atoi(cadena);   //Convertimos la cadena de caracteres en enteros
    Serial.println(valor);//Imprimimos el valor
    posicion=0;           //Ponemos la posicion a 0

    a=0;
    return(c);  // Quien es "c" ??
  } }             // No casan pero supungo que lo tienes en cuenta

Verás que he cambiado un poco la forma del proceso.
No es necesario borrar todo el array porque lo unico que necesitamos es un terminador \0 para el string, y se lo damos al final (cadena[posicion]=0).
Dime si cambia algo

Por cierto el sketch que me has pasado, parece contener errores. Creo que son debidos al copy-paste del ejemplo del Process. Repaso el código y lo pongo en "limpio".

ufff muchisimas gracias!! De veras! Estoy apenas iniciandome y el método copy+paste+edit es lo que me hace avanzar. Así que muy seguramente haya cosas no del todo correctas. Estaré atento a tus comentarios.

Por otro lado, "return(c); // Quien es "c" ??" en este caso, c es el char que va leyendola función. Principalmente la función a() no está editada. Las pruebas las he hecho sobre Curl() para ir probando y avanzando.. :blush:

El problema es que llevo todo el dia, tratando de capturar la cadena de chars y pasarla a una variable int... y no ha habido forma. :sweat_smile:

Gracias de nuevo!

La funcion NO usa "c" para nada, es más "c" NO está definida. Lo que sí está definido es un array "char c[9]" que lógicamente no se usa pues no se puede retornar en la sentencia: "return(c)", ya que la funcion retorna un "char".

Hay muchas inconsistencias y errores en el conjunto, porque un programa debe estar estructurado y es interdependiente, no una coleccion de sentencias pegadas aquí o allá.

Pero bueno tu problema es de "atoi()", prueba y nos dices. Por cierto si quieres puedes meter esta linea de debug para ver más cosas:

// ...
cadena[posicion]=0;
Serial.println(cadena); // ----->>> DEBUG
valor=atoi(cadena);   //Convertimos la cadena de caracteres en enteros
Serial.println(valor);//Imprimimos el valor
posicion=0;           //Ponemos la posicion a 0
// ...

Ya nos cuentas.

Muchas gracias! lo probaré.

Rezconozco las inconsistencias en el código, pero salgo del paso como puedo jejeje

Entiendo que la funcion runCurl() deberia quedar asi: String runCurl() verdad? Puede que sea por eso el salto de linea. Que en vez de devolver la string, solo devuelve un char.

No.
La funcion deberia quedar así: <char* runCurl()>, porque el <return(c)> que sigue siendo inconsistente porque la cadena se guarda en <cadena>, debe retornar un puntero a caracter.

Pero prueba las modificaciones que te he indicado y cuenta los resultados.

Ya me funciona, muuchas gracias! :)

Me alegro. Edita el titulo del hilo y pon [SOLUCIONADO], tal y como se detalla en la guia del foro.