Go Down

Topic: guardar valor imei en cariable (Read 336 times) previous topic - next topic

agupala

Hola! Actualmente estoy trabajando con una placa sim 808, y lo que estoy necesitando y no consigo es como hacer para almacenar en una variable el imei de mi placa.
Uso el siguiente código pero no me muestra nada por pantalla

 void read_Imei() {
  gprsSerial.println("at+cgsn");
  read_String2();
    strcpy(imei,inData2);
 }


 void read_String2() {
      index2=0;
     
      while(gprsSerial.available() > 0) // Don't read unless
                                        // there you know there is data
   {
       if(index2 < 19) // One less than the size of the array
       {
           inChar2 = gprsSerial.read(); // Read a character
           inData2[index2] = inChar2; // Store it
           index2++; // Increment where to write next
           inData2[index2] = '\0'; // Null terminate the string
       }
   }
 }

Con cualquier ayuda les voy a agradecer. Muchas gracias!

Lucario448

Prueba esta función y nos cuentas:
Code: [Select]
void read_String2() {
  delay(100); // Dependiendo de la velocidad del puerto serial, sería prudente esperar un poco para recibir la cadena completa
  if (gprsSerial.available())
    inData2[gprsSerial.readBytes(inData2,
    gprsSerial.available() < sizeof(inData2) - 1 ? gprsSerial.available() : sizeof(inData2) - 1)] = 0;
}


Explicación de esta línea:
Code: [Select]
inData2[gprsSerial.readBytes(inData2,
gprsSerial.available() < sizeof(inData2) - 1 ? gprsSerial.available() : sizeof(inData2) - 1)] = 0;

Básicamente dice que lea todos los bytes/caracteres disponibles, pero sin desbordar el búfer. Esto es posible mediante la respuesta a la pregunta: "¿la cantidad de bytes disponibles es menor (o igual) que el tamaño del búfer menos uno?"
¿Por qué "tamaño del búfer menos uno"? Obligatoriamente hay que reservar un espacio para el terminador de cadenas de caracteres; si se coloca fuera del búfer, pueden haber problemas.

readBytes retorna la cantidad de bytes/caracteres que en realidad se lograron leer; dicho valor se puede aprovechar para determinar la posición en donde debe colocarse el terminador.
Si no hubiera nada para leer, esta función retornaría cero; lo que, por ende, resultaría en colocar el terminador en la primera posición (se leería como una cadena vacía).

agupala

Hola! muchas gracias por la respuesta. Te comento que tuve que "hardcodear" el imei en mi programa, por ahora con eso zafo asi.
Estoy viendo que Arduino lee lo que contesta la placa sim y lo almacena en un array de punteros. Cuando quiero mandar esos datos por internet, obviamente que desaparecen.
 

Lucario448

Estoy viendo que Arduino lee lo que contesta la placa sim y lo almacena en un array de punteros. Cuando quiero mandar esos datos por internet, obviamente que desaparecen.
¿De punteros? ¿No querrás decir que de char? El único puntero que veo aquí, es el que se referencia con el nombre del array.
El búfer del puerto serial es el único que descarta datos después de un intento de lectura; la función que propuse, no debería...

Go Up