Variable non remplie

Bonjour à tous,

Je ne comprend pas pourquoi ma variable n'est pas remplie avec le texte que je lui envoie en paramètre.

Je joins un extrait de mon code ainsi qu'un exemple de la sortie moniteur série.

Merci aux experts et bonnes volontés de m'aider.

int idDate = 480, idHeure = 1282, idTemp = 1281;
String messages = "";

void setup()
  {
  Serial.begin(9600);
  }

void envoiMessages(int ident)
  {
  byte i, debut = 0;
  char trame[8];
  byte longueur = messages.length();
  Serial.println(messages);
Decoupe:
  for (i = debut; i < debut + 8; i++)
    {
    trame[i] = messages[i];
    if (i > longueur) trame[i] = ' ';
    }
    Serial.print(F("ident="));
    Serial.print(ident);
    Serial.print(F(" trame="));
    Serial.println(trame[8]);
  if (longueur > i)
    {
    debut += 8;
    goto Decoupe;
    }
  }

void loop()
  {
  messages = "Jeudi 08 novembre 2018";
  envoiMessages(idDate);
  messages = "15:05:30";
  envoiMessages(idHeure);
  messages = "25";
  envoiMessages(idTemp);
  }

Bonjour,

trame à une longeur 8 or i varie de 0 à longueur donc tu ecris en dehors de trame[]

  • il te faut deux index, un dans trame qui varie de 0 à 7 un dans messages qui varie de 0 à longueur-1
  • de plus il faut un 0 de fin à la fin de trame donc char trame[9]; et trame[8]=0;
  • si tu veux afficher la chaine trame ce n'est pas Serial.println(trame[8]); mais Serial.println(trame);

évites le goto

Bonsoir kamill,

Merci pour ton aide rapide et efficace.

tu me dis :
"trame à une longueur 8 or i varie de 0 à longueur donc tu écris en dehors de trame[]"

il me semble que la boucle for va de 0 à 7 puis 8 à 15 etc ...
donc le test :
if (i > longueur) trame = 0;
sert à finir de remplir la dernière trame de 8 octets je pense ???
ok et merci pour les 2 derniers points

comme tu dis ta boucle for va de 0 à 7 puis 8 à 15 ... donc que tu fais trame[i] = messages[i]; tu écris dans trame[8], trame[9] ... ce qui est complètement en dehors de trame[]

Je ne sais pas ce que fait trame=0 les variables n'étant pas du même type. Normalement le compilateur devrait le refuser.

c'est vrai, les newbies sont "têtus" :wink:

mais j'ai trouvé une solution beaucoup plus simple et qui fonctionne :

int idDate = 480, idHeure = 1282, idTemp = 1281;
String messages = "";

void envoiMessages(int ident)
  {
  byte debut = 0;
  byte fin = 8;
  byte longueur = messages.length();
  String trame;
  Serial.println(messages);
Decoupe:
  trame = "";
  trame.concat(messages.substring(debut, fin));
  Serial.print(F("ident="));
  Serial.print(ident);
  Serial.print(F(" trame="));
  Serial.print(trame);
  if (longueur > fin)
    {
    debut += 8;
    fin += 8;
    goto Decoupe;
    }
  }

void loop()
  {
  messages = F("Jeudi 08 novembre 2018");
  envoiMessages(idDate);
  messages = F("       15:05:30");
  envoiMessages(idHeure);
  messages = F("25");
  envoiMessages(idTemp);
  while(1);
  }

Merci encore et bonne journée

N’utilisez pas la classe String sur un petit arduino. Vous vous exposez à des déconvenues pour des plus gros programmes. Utiliser le bêtes cStrings (tableau de caractères terminé par ‘\0’) et les fonctions standard comme itoa(), strcat(), strcpy() pour construire la chaîne et pour découper en morceaux il suffit juste de parcourir la cString avec un pointeur

Un truc du genre:

enum identification_t : int {idDate = 480, idHeure = 1282, idTemp = 1281};

void envoiMessages(identification_t ident, const char * message)
{
  const byte tailleMaxEmmission = 8;
  char bufferMessage[tailleMaxEmmission + 1]; // +1 pour le caractère null à la fin de la cString
  size_t longeurMessage = strlen(message);
  bufferMessage[tailleMaxEmmission] = '\0'; // le buffer sera comme cela toujours une cString bien terminée

  Serial.print(F("Decoupage de ["));
  Serial.print(message);
  Serial.println(F("]"));

  for (size_t i = 0; i < longeurMessage; i += tailleMaxEmmission) {
    strncpy(bufferMessage, message + i, tailleMaxEmmission);
    Serial.print(F("trame #"));
    Serial.print(i / tailleMaxEmmission);
    Serial.print(F(", identifcation #"));
    Serial.print(ident);
    Serial.print(F(", trame = {"));
    Serial.print(bufferMessage);
    Serial.println(F("}"));
  }
  Serial.println();
}

void setup() {
  Serial.begin(115200);
  envoiMessages(idDate, "Jeudi 08 novembre 2018");
  envoiMessages(idHeure, "15:05:30");
  envoiMessages(idTemp, "25");
}

void loop() {}

va afficher cela dans la console:

[color=blue]Decoupage de [Jeudi 08 novembre 2018]
trame #0, identifcation #480, trame = {Jeudi 08}
trame #1, identifcation #480, trame = { novembr}
trame #2, identifcation #480, trame = {e 2018}

Decoupage de [15:05:30]
trame #0, identifcation #1282, trame = {15:05:30}

Decoupage de [25]
trame #0, identifcation #1281, trame = {25}
[/color]