mon print affiche un truc qui n'a rien à voir avec la variable de type constante

Bonjour à tous,

J'ai vraiment du mal à comprendre ce qui m'arrive!!!

Ma variable 'file' prend la valeur passée dans le premier parametre de la donction suivante. Soit la valeur de str_aux1.

J'ai une fonction

int8_t WI908::uploadFileFTP( const char* file, 
                  const char* path, 
                  const char* user, 
                  const char* passw, 
                  const char* ftp_server, 
                  const char* ftp_port, 
                  uint8_t n_conf)
{

et une autre qui va retourner la date et l'heure.
Cette fonction fonctionne et retourne la date et l'heure sous cette forme

2014-12-27-14-41-10

char * WI908::get_time(void)
{
  strcpy_P(str_aux1, (char*)pgm_read_word(&(table_AT[12])));  // CCLK
  snprintf(str_aux1, sizeof(str_aux1), "%s?", str_aux1);
  
  if(sendATcommand1(str_aux1, OK_RESPONSE,4000,true,false))
  {

    get_value(response[1],1," ",get_val);

    byte i = 0;
    byte x = 0;
    byte ind = 0;

    //Serial.println(strlen(get_val));

    do // Go trough chaine, one by one
    {
      //Serial.println(chaine[ic]);
      switch(get_val[i]){
        case '/':                 // When it read a comma, increment ind. Ind will no be egal to index and then val will not take new value. 

            get_val[i] = '-';
            break;              // return to the begin of 'do' loop and check next position of chaine

        case ',':
            get_val[i] = '-';
            break;
        
        case ':':
            get_val[i] = '-';
            break;
        default:

            get_val[i] = get_val[i];  // Store the desired value in val  
           // Serial.print(F("Def")); Serial.println(val[x]);
          
      }
      // Serial.print(F("i:")); Serial.print(i);
      // Serial.print(F(", g:")); Serial.println(get_val[i]);
      i++;                       // Go to next position of chaine
      

    }while( i < strlen(get_val)); // As long as ic is < than the amount tof caracter in chaine, and then leave the do loop
    get_val[i]='\0';  // Close val with \0
    
    snprintf(buffer, sizeof(buffer),"20%s",get_val); // 20 first caracter of get_val
  }
  else
  {
    strcpy(buffer,"Error with time");
  }

  return buffer;
}

Donc si je fais

Serial.println(get_time())

Il affichera

2014-12-26-14-41-33

Voilà, maintenant je fais appelle avec ma fonction uploadfileFTP ainsi

uploadFileFTP(get_time(),"temp/", "username", "password", "www.serveur.net", "21", 1);

Voci maintenant ce qui bug!!!
Je mets le debut de cette dernier fonction avec la partie qui bug

int8_t WI908::uploadFileFTP( const char* file, 
                  const char* path, 
                  const char* user, 
                  const char* passw, 
                  const char* ftp_server, 
                  const char* ftp_port, 
                  uint8_t n_conf)
{
      
  

  unsigned long previous = 0;
  int8_t answer = 0;
  uint8_t count = 10;
  uint8_t ftp_retries;
  long sd_size = 0;
  long ftp_size = 0;
  int CME_aux = 0;
   



  // YURI DELAY
  delay(100);

    #ifdef DEBUG
    sprintln(F("\n*CONFIG FTP*"));
  #endif

Serial.println(file); // Affichage correct

  // SET FTP BEARER PROFILE IDENTIFIER: AT+FTPCID=<n_conf>
  strcpy_P(str_aux1, (char*)pgm_read_word(&(table_AT[26])));  //"+FTPCID="
  snprintf(str_aux1, sizeof(str_aux1), "%s=%u", str_aux1, n_conf);
  #ifdef DEBUG
    sprint(str_aux1);
    sprint(F("\t\t"));
  #endif


Serial.println(file); // Affichage correct

  count=10;
  do{
    answer=sendATcommand2(str_aux1, OK_RESPONSE, ERROR_CME,6000,true,false);
    count--;
  }while ((answer != 1) && (count > 0));
  
  if (answer == 0)
  {
    #ifdef DEBUG
      sprintln(F("KO"));
    #endif
    return -4;
  }
  else if (answer == -2)
  {
    #ifdef DEBUG
      sprintln(F("KO"));
    #endif
    return -41;
  } 
  #ifdef DEBUG
    sprintln(F("OK"));
  #endif


  Serial.println(file); // Affiche la valeur de str_aux1 ????!!!


[... Suite du code..]

Dans ce code
Serial.println(file) va afficher le contenu de la variable str_aux1!!!!!! et non pas une heure sous ce format:2014-12-26-14-44-23
Mais pourquoi???

Je ne comprend pas car 'file' est defini comme 1er parametre de ma fonction. Donc la valeur de 'file' doit rester la meme dans cette fonction

Dans cette partie:

// SET FTP BEARER PROFILE IDENTIFIER: AT+FTPCID=<n_conf>
  strcpy_P(str_aux1, (char*)pgm_read_word(&(table_AT[26])));  //"+FTPCID="
  snprintf(str_aux1, sizeof(str_aux1), "%s=%u", str_aux1, n_con

f);

la valeur que va prendre str_aux1, ne doit pas avoir d'incidence sur 'file'. 'file' a deja sa valeur (constante) au debut de cette fonction.

Comment 'file' peut prendre la valeur d'str_aux1????? En plus, c'est une cosntante, donc elle devrait pas pouvoir changer de valeur, non??

Pouvez-vous m'écliarecir?
Avez-vous besoin plus de code?

Milles mercis et bonnes fetes

Où est défini le buffer que tu retournes dans get_time() ?

Salut
(J'ai ajouté un Serial.println(file) dans ma fonction)

Le buffer est défini dans le fichier wi908.h
sous public:

#define BUFFERSIZE 250
char buffer[BUFFERSIZE];

Le code que j'ai posté est dans le fichier wi908.cpp

Ton buffer n'est modifié que si la commande AT est OK. Est-ce bien ce que tu veux ?

Hello,
EN fait il faudrait que je refléchisse sur la function get_time(), car si je replace ca

snprintf(buffer, sizeof(buffer),"20%s",get_val); // 20 first caracter of get_val

par ca

snprintf(get_val, sizeof(get_val),"20%s",get_val); // 20 first caracter of get_val

Je n'ai plus mon problème, mais j'en ai un autre

snprintf(get_val, 20,"20%s",get_val); // 20 first caracter of get_val
Serial.println(get_val);

L'affichage du get_val affichera '2020202020202020' alors que avant le snprintf(), get_vall affiche correctement:

14-12-26-14-44-22+4

Le but de mon opération c'est d'ajouter 20 devant le 14 (2014) et de ne plus avoir +4. Pour ne plus avoir +4, j'ai mis 20 dans le snprintf, pour qu'il affiche les 19 premieres caracter :o)

Si c'est juste pour insérer des blancs, j'utiliserais memcpy() et en jouant avec 2 buffers et 2 pointeurs de char.

D'accord, merci.
J'ai opté pour l'option d'une nouvelle variable global pour l'heure. Ca m'emnbete un peu car je suis limite, mais je vais me pencher sur ta proposition.

Merci

en fait, memcpy(), c'est un peu la meme chose que strncpy()?

presque :

  • memcpy copie un bloc de mémoire de la taille donnée
  • str*cpy copie une chaîne de caractère de taille max, en s'arrêtant au caractère zéro.