Tableau dynamique

Bonjour, je suis actuellement sur la partie communication serie d’un projet, je reçois les données d’une façon basique:

if(Serial.available())
{
  for(int i= 0;Serial.available();i++)
  {
     Serial.flush();
     serial_data[i] = Serial.read();
     delay(1);
  }
}

Seulement, mon tableau serial_data de type tableau de char est bloqué par la taille de tableau que j’ai défini, cependant je ne connais pas à l’avance la taille maximal de ce tableau, comment pourrais-je procéder afin de ne pas limiter la taille de réception?
J’ai vraiment pas l’habitude de travailler avec du C bas niveau.

Merci

En théorie, pour recevoir une chaîne de caractères de longueur variable tu pourrais utiliser une variable de type String :

String serial_data;

if(Serial.available())
{
  for(int i= 0;Serial.available();i++)
  {
     Serial.flush();
     serial_data += Serial.read();
     delay(1);
  }
}

Une variable String est dynamique. Le “système” va automatiquement augmenter la taille quand nécessaire.

Toutefois, ce type de gestion dynamique est vivement déconseillé sur un système embarqué, surtout quand il y a peu de mémoire comme sur un Arduino.

En gros : sur un telle système, tu dois toujours maîtriser ce qu’il se passe sous peine de perdre de contrôle et de ne plus rien comprendre.

Je te conseille donc :

  1. De bien savoir quelle taille maximale tu peux recevoir, cette taille devant être raisonnable par rapport a la RAM d’un Arduino et ses capacités de traitement. “j’en sais rien” n’est pas une réponse valable ;). Tu dois savoir.
  2. Contrôler que lors de la réception tu ne dépasse pas la taille maximale et prendre les mesure qui s’imposent
#define MAX_RECEIVE   50
char serial_data[MAX_RECEIVE]

int char_received = 0;

if(Serial.available())
{
  while ( Serial.available() && (char_received < MAX_RECEIVE) )
    serial_data[char_received++] += Serial.read();

  // quelque part il te faut aussi déterminer que tu as reçu l'intégralité du message
  // comment connais tu la fin ?
  // caractère spécial ? (retour chariot, ...)
  // Une fois traité, ne pas oublier de remettre char_received  à 0
}

Quel est le sens de ce Serial.flush()?
Suivant la version de l'IDE utilisée, il n'a pas la même fonction.

String ne fonctionne pas, si je fais

String chaine1;

Puis que j’ajoute des caractères la chaine reste vide,

Par contre si je fais

String chaine1 = "12345";

Je peux ajouter max 5 caractères.

La méthode avec String m’intéresse, si cela ne marche pas je définirais à 150 caractères max.

Pour le Serial.flush() je ne sais pas précisément, ce code est un extrait d’un exemple, cependant lorsque je l’enlève cela ne change rien, je vais peut-être l’enlever.

String serial_data;

void setup()
{
  Serial.begin(9600);
  while( !Serial ); // Si Leonardo
}

void loop()
{
    if ( Serial.available() )
    {
      while ( Serial.available() )
      {
        char c = Serial.read();
        if ( c == 13 )
        {
          Serial.print( "serial_data = " );
          Serial.println( serial_data );
          serial_data = "";
        }
        else
        {
          Serial.print( "caractere recu = " );
          Serial.println( c );
          serial_data += c;
        }
      }
    } 
}

serial-test.png

Si j'exécute ton code et que j'utilise le moniteur serie pour écrire quelque chose, j'ai seulement des espaces dans l'affichage, soit aucun caractère visuel.

Tu as pressé "Entrée" ?

Le terminal de l'IDE Arduino ne transmet des caractères qu'après avoir pressé "Entrée"
C'est pour cela que j'ai utilisé TeraTerm

Ci dessous la même chose avec le terminal Arduino en utilisant le mode "Carriage return only" !

serial-test2.png

Oui j'ai bien pressé "Entrée".
Je possède une Arduino Uno, peut-être qu'il y a une différence de fonctionnement ? (J'ai retiré la ligne pour les leonardo).