Asignar Cadena a una variable char*

Hola

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

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:

no matching function for call to 'String::String(String&, int)'

Si cambio la linea url = "Localizacion: http://maps.google.com/maps?q=loc:" + String(latitude, 6) + "," + String(longitude, 6); a url[] = "Localizacion: http://maps.google.com/maps?q=loc:" + String(latitude, 6) + "," + String(longitude, 6); el error cambia a

expected primary-expression before ']' token

Saludos.

te esta diciendo claramente que no hay ningun metodo del objeto String que acepte como
segundo parametro un int.

String(latitude, 6)

seguramente sea por ese 6

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:

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

sprintf(aux_str, "AT+CMGS=\"+573001234567\"", strlen(sms));

y cambiarla a esto:

sprintf(aux_str, "AT+CMGS=\"+57" + "\"", strlen(sms));

el compilador muestra el siguiente error:

invalid operands of types 'const char [13]' and 'const char [2]' to binary 'operator+'

Cambié la línea de nuevo a

sprintf(aux_str, Destinatario, strlen(sms));

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

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

Destinatario = "AT+CMGS="+57" + """;

el compilador arroja el error

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

  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

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!");
  }
}

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

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:

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:

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:

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.

ArduMyth:
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 :confused:

ArduMyth:
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.