Go Down

Topic: Asignar Cadena a una variable char* (Read 997 times) previous topic - next topic

1010010100110

Hola

Deseo asignar a una variable char* un texto. Pero da error. El código es el siguiente:



Code: [Select]

char url[120];
String latitude = "4.000000";
String longitude = "-74.000000";

void setup() {
  // Codigo de configuracion
}

void loop() {
  // Bucle sin fin.
  url = "Localizacion: http://maps.google.com/maps?q=loc:" + String(latitude, 6) + "," + String(longitude, 6);
  sendUrlToUsers(url);
}

void sendUrlToUsers(char* url) {
  sendSms("+573001234567", url);
  sendSms("+573002345678", url);
  sendSms("+573003456789", url);
  sendSms("+573004567890", url);
}

void sendSms (char* telefono, char* mensaje) {
  // Codigo que envia el mensaje
}


Pero al compilar aparece el error:
Quote
no matching function for call to 'String::String(String&, int)'
Si cambio la linea
Code: [Select]
url = "Localizacion: http://maps.google.com/maps?q=loc:" + String(latitude, 6) + "," + String(longitude, 6); a
Code: [Select]
url[] = "Localizacion: http://maps.google.com/maps?q=loc:" + String(latitude, 6) + "," + String(longitude, 6); el error cambia a
Quote
expected primary-expression before ']' token
Saludos.

_jose_

#1
Jul 16, 2018, 08:59 am Last Edit: Jul 16, 2018, 08:59 am by _jose_
te esta diciendo claramente que no hay ningun metodo del objeto String que acepte como
segundo parametro un int.
Code: [Select]
String(latitude, 6)
seguramente sea por ese 6

1010010100110

Hola.

Lo que pasa es que tengo que enviar diferentes tipos de información por medio de mensajes de texto a diferentes personas, con esta función que encontre y funciona bien. Hay otras más sencillas pero no sé porque a veces funcionan y a veces no. Pero esta no me ha dado ningún problema, pero el código está un poco enredado para mis conocimientos muy básicos de arduino.

Esta es la función original:

Code: [Select]

void mensaje_sms()
{
  if (enviarAT("AT+CREG?", "+CREG: 0,1", 1000) == 1) //comprueba la conexion a la red
  {
    Serial.println("Enviando SMS...");
    enviarAT("AT+CMGF=1\r", "OK", 1000); //Comando AT para mandar un SMS
    sprintf(aux_str, "AT+CMGS=\"+573008986280\"", strlen(sms)); //Numero al que vamos a enviar el mensaje
    //Texto del mensaje
    if (enviarAT(aux_str, ">", 10000) == 1)
    {
      enviarAT(sms, "OK", 10000);
    }
    Serial.println("SMS enviado");
  }
  else
  {
    reiniciar();
    iniciar();
  }
}


Deseo que la función pueda recibir dos parámetros distintos, el teléfono, y el mensaje.

al alterar la línea

Code: [Select]
sprintf(aux_str, "AT+CMGS=\"+573001234567\"", strlen(sms));

y cambiarla a esto:

Code: [Select]
sprintf(aux_str, "AT+CMGS=\"+57" + "\"", strlen(sms));

el compilador muestra el siguiente error:

Quote
invalid operands of types 'const char [13]' and 'const char [2]' to binary 'operator+'
Cambié la línea de nuevo a

Code: [Select]
sprintf(aux_str, Destinatario, strlen(sms));

donde 'Destinatario' es un String. Se produce este error:

Quote
cannot convert 'String' to 'const char*' for argument '2' to 'int sprintf(char*, const char*, ...)'
lo que significa que solo recibe un char*. Cambié la definición de destinatario a char*. EL programa compila bien.

Ahora el problema es crear la lnea "AT+CMGS=\"+57XXXXXXXXXX\"". donde XXXXXXXXXX es un número que cambia dependiendo del mensaje.´

Intente con la siguiente línea

Quote
Destinatario = "AT+CMGS=\"+57" + "\"";
el compilador arroja el error

Quote
invalid operands of types 'const char [13]' and 'const char [2]' to binary 'operator+'
Intenté con StringAppendOperator, StringAdditionOperator, concat,  etc pero no funcionó.

Mientras escribí esta respuesta probé con el siguiente código

Code: [Select]
  char Destinatario[30];
  strcpy(Destinatario, "AT+CMGS=\"+57");
  strcpy(Destinatario, Tel);
  strcpy(Destinatario, "\"");


El cual si funcionó. El código completo de la nueva función es este

Code: [Select]
void EnviaMensaje(char* Tel, char* Msj)
{
  char Destinatario[30];
  strcpy(Destinatario, "AT+CMGS=\"+57");
  strcpy(Destinatario, Tel);
  strcpy(Destinatario, "\"");
 
  if (enviarAT("AT+CREG?", "+CREG: 0,1", 1000) == 1) //comprueba la conexion a la red
  {
    Serial.println("Enviando SMS...");
    enviarAT("AT+CMGF=1\r", "OK", 1000);
    sprintf(aux_str, Destinatario, strlen(Msj));
    //Texto del mensaje
    if (enviarAT(aux_str, ">", 10000) == 1)
    {
      enviarAT(sms, "OK", 10000);
    }
    Serial.println("SMS enviado");
  }
  else
  {
    Serial.println("GMS: error!");
  }
}





Lucario448

El cual si funcionó. El código completo de la nueva función es este

Code: [Select]
void EnviaMensaje(char* Tel, char* Msj)
{
  char Destinatario[30];
  strcpy(Destinatario, "AT+CMGS=\"+57");
  strcpy(Destinatario, Tel);
  strcpy(Destinatario, "\"");
  
  if (enviarAT("AT+CREG?", "+CREG: 0,1", 1000) == 1) //comprueba la conexion a la red
  {
    Serial.println("Enviando SMS...");
    enviarAT("AT+CMGF=1\r", "OK", 1000);
    sprintf(aux_str, Destinatario, strlen(Msj));
    //Texto del mensaje
    if (enviarAT(aux_str, ">", 10000) == 1)
    {
      enviarAT(sms, "OK", 10000);
    }
    Serial.println("SMS enviado");
  }
  else
  {
    Serial.println("GMS: error!");
  }
}

¿Deberas? Porque hasta donde tengo entendido:
Code: [Select]
char Destinatario[30];
strcpy(Destinatario, "AT+CMGS=\"+57");
strcpy(Destinatario, Tel);
strcpy(Destinatario, "\"");

Destinatario tendría solamente ". strcpy sobrescribe, no concatena.

Lo correcto sería:
Code: [Select]
char Destinatario[30];
sprintf(Destinatario, "AT+CMGS=\"+57%s\"", Tel);




Esto no hace absolutamente nada más que copiar una cadena de un lugar a otro:
Code: [Select]
sprintf(aux_str, Destinatario, strlen(Msj));
Y strlen(Msj) tampoco tiene propósito alguno. Hasta donde se sabe sobre el contenido de Destinatario, no hay formateador (parámetro que inicia con %) que indique dónde debe ir un número entero.

Lucario448

creo que pudo equivocarse al ver mi ejemplo, pues la primera función que uso es strcpy() para añadir a buf la cadena principal PERO después concateno con strcat(). Lo mismo hizo una lectura rápida del código y mezcló los conceptos por eso sólo usa lo primero.
Esa es una posibilidad, pero por como lo posteó diciendo que le funciona, es lo que me deja en duda :smiley-confuse:


En cualquier caso son funciones diferentes y es tal y cómo dices con strcpy() por tanto no sé cómo hace el autor, porque no cuadra.
Por eso no dudé en cuestionarlo. No para que me lo tome de mala manera, sino para no acabar en una solución a medias.

Go Up