Protocole Série bidirectionnel (question/réponse) entre 2 cartes

Bonjour,
Voila plusieurs jours que je me questionne sur un protocole de com série entre 2 Arduino SoftwareSerial.
Je souhaite faire un outil sécurisé pour transmettre des string qui contrôle:
*l’intégrité du message
*Si le message n’est pas en doublon
*Un TimeOut
J’y arrive trés bien à basse vitesse, mais quand je commence à débrider, les erreurs, puis les TimeOut…

Il faudrait que j’instaure une sorte de synchro (maitre / esclave) mais je ne sais pas comment m’ prendre.

Je met mes 2 code. Il y à surement des choses à corriger.

Les variables:

#include <SoftwareSerial.h>              // Library serial /!\ Commenter cette ligne sur Arduino mega
SoftwareSerial Serial1(8, 7);            // Port série virtuel pour le dialogue entre carte: TX, RX /!\ commenter cette ligne sur arduino mega

String read;                             // Elément a envoyer sous forme de string
String buffer;                           // Buffer de réception
String write;
String hold;
int cpt;

//Tempo multi
int TempoNum;                           // Numerot de la tempo a appeler
int TempoSible;                         // Temps de pause

// Tempo multi. Renseigner cible (temps) et lire résultat (1 si ok)
//Trans,  0,   0,   0,   0,   0
int Tempo[3][6] = {{'0', '0', '0', '0', '0', '0'}, // Valeur cible
  {'0', '0', '0', '0', '0', '0'},                  // Valeur incrémenté
  {'0', '0', '0', '0', '0', '0'}                   // Resultat
};

Send:

void Send() {
  TempoNum = 1;                        // Numerot de la tempo a appeler
  TempoSible = 10;                     // Temps de pose

  //--------------------------------------------------------------------
  Serial1.print(write);                // Envoie le message du String write
  delay(100);
Debut:
  //--------------------------------------------------------------------
  buffer = "";                         // Vide le buffer
  while (1 <= Serial1.available()) {   // Reçois tout sauf le dernier Octet
    char c = Serial1.read();           // Octet de réception en tant que caractère
    buffer += c;                       // Ajoute le caractere dans le String buffer
  }
  Temporisation ();                    // Appel de la fonction tempo
  if (Tempo[2][TempoNum] == 1)         // Si la tempo est terminée
  {
    Serial.println("Send ok");
    return;
  }
  //Serial1.print(write);
  goto Debut;
}

Receve:

void Receve ()
{
  TempoNum = 1;                          // Numerot de la tempo a appeler
  TempoSible = 20;                     // Temps de pose
Debut1:
  //Serial.println(Serial1.available());
  if (Serial1.available() > 0) {         // Le buffer de réception est il plein?cpt++;
    //--------------------------------------------------------------------
    buffer = "";                         // Vide le buffer
    while (1 <= Serial1.available()) {         // Le buffer de réception est il plein?cpt++;
      //--------------------------------------------------------------------) {   // Reçois tout sauf le dernier Octet
      char c = Serial1.read();             // Octet de réception en tant que caractère
      buffer += c;                         // Ajoute le caractere dans le String buffer
    }
    //Serial1.print(read );                // Renvoie le message pour vérification
    //--------------------------------------------------------------------
    if (buffer != read || buffer == hold)                  // Vérifie que le message reçu est le bon
    {
      //Serial.println("buffer != read || buffer == hold");
      Temporisation ();                      // Appel de la fonction tempo
      if (Tempo[2][TempoNum] == 1)           // Si la tempo est terminée
      {
        Serial.println("TimeOut");
        read = "";
        return;
      }
      read = buffer;
      goto Debut1;                        // Le message est en doublon, on recommence
    }
    hold = buffer;
    read = buffer;
  }
  Temporisation ();                      // Appel de la fonction tempo
  if (Tempo[2][TempoNum] == 1)           // Si la tempo est terminée
  {
    Serial.println("TimeOut");
  }
}

Temporisation

int Temporisation ()
{
  if (Tempo[1][TempoNum] == 0)                     // Si la tempo démarre
  {
    Tempo[0][TempoNum] = TempoSible;               // On initialise le temps
  }
  if (Tempo[1][TempoNum] < Tempo[0][TempoNum])     // Si la tempo n'est pas terminée
  {
    Tempo[1][TempoNum]++;                          // On incrémente
    Tempo[2][TempoNum] = 0;                        // C'est pas fini
    delay(1);
  }
  else                                             // Temps écoulé
  {
    Tempo[0][TempoNum] = 0;                        // Initialisation
    Tempo[1][TempoNum] = 0;                        // Initialisation
    Tempo[2][TempoNum] = 1;                        // C'est fini
  }
}

Salut
J’ai fait une lib pour ça :

Merci, je vai tester

tahitibob35:
Salut
J'ai fait une lib pour ça :
GitHub - Tahitibob35/SerialComm: Serial communication library for Arduino

Bonjour, tu peu donner des exemples fonctionnel?

Bonjour,

Zarb94:
Bonjour, tu peu donner des exemples fonctionnel?

Si tu explorais un peu le lien de tahitibob35, tu verrais qu'il y a des exemples (3)
@+

Je suis désolé, je suis novice et je ne parviens pas à utiliser cette lib. J'ai bien suivi le lien de téléchargement, lu les instructions, c'est pourquoi je demandais un exemple fonctionnel et éventuellement commenté.
Merci.

Salut
j'utilise la librairie EasyTransfer pour faire mes liaisons série, softserial et I2c.

Elle permets de transferer tout type de variables du moment que l'on écrit correctement le même tableau de définition dans les arduino.
yan_alp73