Crear una cadena Char con el caracter "

Buenas tardes. Tengo que crear una cadena y le pasaré variables.

La cadena que quiero construir seria:

"/GesRegistresAPI/api/registres ", "nomUsuari=xxxxxx&passwordUsuari=@yyyyyy&idSonda=1003&idTipusSonda=1&valor=999"

La intento definir:
char INSERT_POST = "/GesRegistresAPI/api/registres " & ',' & "nomUsuari=%s&passwordUsuari=%s&idSonda=%s&idTipusSonda=%s&valor=%s";

Pero esto " & ',' & " no es correcto !!!
No enquentro la manera de hacerlo bien !!!
Grácias.

por favor use inglés en el foro general. Moví tu publicación en la sección de español.


¿Realmente necesitas construir el String?
¿No puedes enviarlo pieza por pieza?

Para que una cadena, que se delimita con el carácter " pueda contener a su vez ese carácter, se ha de escapar con el carácter \. Así que si lo que se quiere que la cadena contenga "esto un texto que tiene " al principio y al final", se ha de definir:

char texto[] = "\"esto es un texto que tiene \" al principio y al final\"";

Por cierto, si lo que se quiere es que contenga el carácter \, entonces se ha de escapar con otra \. Con lo que se ha de poner \\. Para poner: este texto tiene una sola \ y una "

char texto[] = "este texto tiene una sola \\ y una \"";

Grácias a los dos.

char INSERT_POST = "/GesRegistresAPI/api/registres ", "nomUsuari=xxx&passwordUsuari=yyyyy&idSonda=%s&idTipusSonda=%s&valor=%s";

Resuelto, pero temgo problemas nuevos !!!
Con este programa, quiero leer datos de un MySQL para para poder parametrizar la lectura de datos. Una vez tengo el intervalo de tiempo a leer etc, quiero guardar la lectura en otra tabla de la base de datos.
Estoy experimentado con POST y el GET. Metodo muy interesante, pero no ho habia utilizado antes.

Primer problema, ya estoy sobrepasando el limte de uso de memoria !!!
Otro problema:

void RegistreMySQL()
  {
  String response; 
  char INSERT_POST[] = "/GesRegistresAPI/api/registres \", \"nomUsuari=xxxx&passwordUsuari=yyyyy&idSonda=%s&idTipusSonda=%s&valor=%s";
  char query[128];

  sprintf(query, INSERT_POST, idSonda, "t", Temperatura);
  Serial.println(query);

  //POST
  Serial.println("POST:");  
  response = "";
  client.setHeader("Content-Type: application/x-www-form-urlencoded");
  //int statusCode = client.post("/GesRegistresAPI/api/registres ", "nomUsuari=xxxx&passwordUsuari=yyyy&idSonda=1003&idTipusSonda=1&valor=999", &response);
  int statusCode = client.post(query, &response);
  Serial.print("Status code from server: ");
  Serial.println(statusCode);
  Serial.print("Response body from server: ");
  Serial.println(response);
  Serial.println("------------------");    
  }

No estoy haciendo bien:

int statusCode = client.post(query, &response);

El error es:
no matching function for call to 'RestClient::post(char [128], String*)'

Si escrobo directamente:

int statusCode = client.post("/GesRegistresAPI/api/registres ", "nomUsuari=xxxx&passwordUsuari=yyyyidSonda=1003&idTipusSonda=1&valor=999", &response);

Si funciona bien !!!

¿alguna idea? ¿Que tipo de variable tiene que ser la variable "query"? Yo solo se passar parametros si es del tipis char !!!

Mil gracias.

¿cual es el tipo de client? probablemente no quieras pasar el pointer de la instancia de String

no publique fragmentos (Snippets R Us!)

Client es:

RestClient client = RestClient("x.x.x.x");

Estoy utilizando la libreria:

#include "RestClient.h"

esta es la firma de la función

int post(String path, String body);

deberías escribir

statusCode = client.post(query, response);

Grácias J-M-L Jackson.
Pero ya es lo que tengo !!!
Si "query" la defino como String, el error es el mismo !!!

Esto es correcto:

int statusCode = client.post("/GesRegistresAPI/api/registres ", "nomUsuari=xxxx&passwordUsuari=yyyyy&idSonda=1003&idTipusSonda=1&valor=999", &response);

Pero esto no:

int statusCode = client.post(query, &response);

Adjunto toto el codigo, el problema està en la la función del POST, la "RegistreMySQL". La funció del Get la "LlegirMySQL, funciona bien.

#include <Ethernet.h>
#include <SPI.h>
#include "RestClient.h"

RestClient client = RestClient("x.x.x.x");

int idSonda  = 1003;                       // Id de la Sonda, cada sona ha de portar un Id Unica

float Temperatura ;
float Calibratge = 0; //
int TempsEntreLectures = 1;
int OnOff = 0;     //0= no gravem 1=si gravem
//String TipusSonda;

char userMySQL[] = "xxxx";              // MySQL user login username
char passwordMySQL[] = "yyyyy";        // MySQL user login password


void setup() 
  { 
  Serial.begin(9600);
  Serial.println();
  Serial.println("Iniciant SETUP...");
  Serial.print("Idsonda:"); Serial.println(idSonda);

  Serial.println("Connectant a la xarxa...");
  client.dhcp();
  LlegirMySQL();
  CapturaDeDades(); 
  Serial.println("Fi SETUP");
  Serial.println("*****************");
  delay (6000);
  }


void loop() 
  {
  LlegirMySQL();
  CapturaDeDades(); 
  if (OnOff == 1) Serial.println(" -> OnOff = ON");
  if (OnOff == 0) Serial.println(" -> OnOff = OFF");
  //if (OnOff == 1) RegistreMySQL(idSonda, "t", Temperatura);
  if (OnOff == 1) RegistreMySQL();
  RegistreMySQL();
  // Temps que esperem entre captura i captura, en minuts--------------------    
  Esperem (TempsEntreLectures); //esperem 1, 10 minut,...
  // Fi espera entre dades---------------------------------------------------  
  }

void RegistreMySQL()
  {
  String response; 
  char INSERT_POST[] = "/GesRegistresAPI/api/registres \", \"nomUsuari=xxxx&passwordUsuari=yyyy&idSonda=%s&idTipusSonda=%s&valor=%s";
  char query[128];
  
  sprintf(query, INSERT_POST, idSonda, "t", Temperatura);
  Serial.println(query);
  //POST
  Serial.println("POST:");  
  response = "";
  client.setHeader("Content-Type: application/x-www-form-urlencoded");
  //int statusCode = client.post("/GesRegistresAPI/api/registres ", "nomUsuari=xxxxx&passwordUsuari=yyyyy&idSonda=1003&idTipusSonda=1&valor=999", &response);
  int statusCode = client.post(query, &response);
  Serial.print("Status code from server: ");
  Serial.println(statusCode);
  Serial.print("Response body from server: ");
  Serial.println(response);
  Serial.println("------------------");    
  }


void LlegirMySQL()
  {
  char *s;
  char *strings[10];
  String response;   
  char SELECT_GET[] = "/GesRegistresAPI/api/config?nomUsuari=xxxx&passwordUsuari=yyyy&idSonda=%s";
  char query[128];
   
  Serial.println(" -> Llegint al MySQL...");
  char idSonaInsertat[6];
  dtostrf( idSonda, 1, 0, idSonaInsertat);   // zero decimals  
  sprintf(query, SELECT_GET, idSonaInsertat);
  Serial.println(query);
  Serial.println("GET:");
  response = "";
  client.setHeader("Content-Type: application/x-www-form-urlencoded");
  int statusCodeGet = client.get(query, &response);
  Serial.print("Status code from server: ");
  Serial.println(statusCodeGet);  //si es 200 es que ha retornar dades correctament
  if (statusCodeGet==200)
    {
    Serial.println("Lectura correcte, les dades son: ");
    Serial.println(response);
    s = strtok(response.c_str(), ";");
    int index=0;
    while (s!=NULL) 
      {
      strings[index]= s;  
      s=strtok(NULL, ";");
      index++;
      }
    for(int n = 0; n < index; n++)
      { 
      Serial.print(n);Serial.print("-->");Serial.println(strings[n]);
      //if (n==5) TipusSonda = strings[n];                //TipusDeSonda
      if (n==6) Calibratge = atol(strings[n])/10;         //Calibratge
      if (n==7) TempsEntreLectures = atol(strings[n]);    //Temps entre lectures
      if (n==8) OnOff = atol(strings[n]);                 //Grabem les dades 1=SI i 0=NO
      }    
    Serial.println("------------------");
    Serial.print(" ->           Calibratge = ");
    Serial.println(Calibratge);   
    Serial.print(" -> Temps entre lectures = ");
    Serial.println(TempsEntreLectures);  
    Serial.print(" ->                OnOff = ");
    Serial.println(OnOff);     
    //Fi Calibratge    
    }
  else
    {
    Serial.println("Error al llegir les dades.");    
    }
  }

//Funció capturar dades------------------------------------------------------
void CapturaDeDades()
  {
  int reading;  
  float Valor, voltage;
    //TMP36 Pin Variables
    int sensorPin = 0;      //Capturarem el valro per el pin 0 analogic, A0
                            //the analog pin the TMP36's Vout (sense) pin is connected to
                            //the resolution is 10 mV / degree centigrade with a
                            //500 mV offset to allow for negative temperatures  
    Serial.println(" -> Capturant dades de la sonda ...");
    reading = analogRead(sensorPin);  //llegim el valor de A0, analogic
    // Convertim la lectrua a voltatge
    voltage = reading * 5.0;
    voltage = voltage/1024.0; //voltage /= 1024.0; 
    // Printem
    Serial.print(" -> Voltatge analogic     = "); Serial.print(voltage); Serial.println(" volts");
    //if (voltage > Calibratge) voltage = voltage - Calibratge;  //calibratge
    //Serial.print(" -> Voltatge analogic cal.= "); Serial.print(voltage); Serial.println(" volts");
    Temperatura = (voltage - 0.5) * 100 ;                      //convertim 10 mv per graus amb un offser 500 mV offset
                                                               //podem fer negatius
                                                               //a graus centigrats ((volatge - 500mV) times 100)
    Serial.print(" -> Temperatura           = "); Serial.print(Temperatura); Serial.println(" graus C");                                                               
    Temperatura = Temperatura + Calibratge;                    //calibratge                                                      
    Serial.print(" -> Temperatura Calibrada = "); Serial.print(Temperatura); Serial.println(" graus C");  
  }
// Fi capturar dades---------------------------------------------------------

// Funció temps d'espera entre captura de dades, en minuts-------------------
void Esperem (int minuts)
  {
  Serial.print(" -> Esperant (minuts) :");
  Serial.print( minuts);
  Serial.print(" ");
  for (int a=0; a<minuts; a++)
    {      
    delay(60000);  //60000 es un minut
    Serial.print(".");
    }
  Serial.println (" ");  
  }
// Fi funció temps d'espera--------------------------------------------------

¿Ves la diferencia?

int statusCode = client.post(query, response); // mi código

int statusCode = client.post(query, &response); // tu código

Si, lo he provado tal como tu propones y el error es el mismo !!!

int statusCode = client.post(query, response);

Error:
no matching function for call to 'RestClient::post(char [128], String&)'

tienes un link a la libreria?

Me da que se les está escapando un pequeño detalle. Esto:

int statusCode = client.post("/GesRegistresAPI/api/registres ", "nomUsuari=xxxx&passwordUsuari=yyyyy&idSonda=1003&idTipusSonda=1&valor=999", &response);

Es una invocación a una función con tres parámetros. Y aquí:

int statusCode = client.post(query, &response);

Se está invocando una función con dos parámetros.

La función client.post() está sobrecargada y hay disponible dos versiones de ella, por eso no da error al compliar, una de ellas adminte dos parámetros y la otra tres.

Prueba este código:

void RegistreMySQL()
  {
  String response; 
  char INSERT_POST[] = "/GesRegistresAPI/api/registres ";                                                 // <-- *** Línea modificada ***
  char INSERT_BODY[] = "nomUsuari=xxxx&passwordUsuari=yyyyy&idSonda=%s&idTipusSonda=%s&valor=%s";  // <-- *** Línea añadida ***
  char query[128];

  sprintf(query, INSERT_BODY, idSonda, "t", Temperatura);           // <-- *** Línea modificada ***
  Serial.println(query);

  //POST
  Serial.println("POST:");  
  response = "";
  client.setHeader("Content-Type: application/x-www-form-urlencoded");
  //int statusCode = client.post("/GesRegistresAPI/api/registres ", "nomUsuari=xxxx&passwordUsuari=yyyy&idSonda=1003&idTipusSonda=1&valor=999", &response);
  int statusCode = client.post(INSERT_POST, query, &response);      // <-- *** Línea modificada ***
  Serial.print("Status code from server: ");
  Serial.println(statusCode);
  Serial.print("Response body from server: ");
  Serial.println(response);
  Serial.println("------------------");    
  }

He modificado la definición de ISERT_POST[], para que contenga la primera cadena.
He añadido la definición de INSERT_BODY[], que contendrá la cadena que se utiliza como "plantilla" para pasar los valores.
He cambiado la llamada a sprintf() para que ponga los valores usando la nueva cadena INSERT_BODY[].
Finalmente he añadido como primer parámetro de la función client.post la cadena INSERT_POST.

Espero que así funcione.

Solucionado !!!

int statusCode = client.post("/GesRegistresAPI/api/registres ", query, &response);

Mil gracias !!!

Me da que se les está escapando un pequeño detalle.
Siiiiii , aquí estaba el problema.

Muchas gracias.

Por favor @aprentik aunque sea una línea postea usando siempre con etiquetas, venía corrigiendo pero me cansé.

Perdona Surbyte.
Prestaré mas atención. Creo que ya los he puesto bien !!!
Gracias.