Communication entre Arduino, message en boucle.

Bonjour à tous,
Pour un projet perso j’ai besoin de faire se parler deux arduino entre elle.
La preière récupère des informations dans le registre d’un servo moteur puis les envoie à la second qui les envoie dans le port serie.
Ca fonction a peu pret sauf que le message envoyé est envoyé 3 fois ou lu 3 fois et des fois pas en entier ce qui pose des souscis.
Le message est une concaténation de string et int que j’envoie char à char car je n’ai pas réussi autrement.
Voici le code de l’Arduino qui envoe :

/*	****** Written by François Blas
 	****** Last Modification: 27/04/13 	
 	
 	Using the Arduino Mega 2560 										
 */

/*
>>>>> Connecter le TX1 (port 18 Arduino Mega 2560) et le RX1 (port 19 Arduino Mega 2560)
 sur le data de l'AX12 (TX1 et RX1 ensemble)
 >>>>> Pas besoin de resistance de pull-up !!!!!!!!!
 */

/*
Decommenter la ligne sous "Changer l'identifiant de l'AX12" puis mettre le nouvel identifiant de l'AX12 a la place de newID
 Televerser vers l'AX12
 Recommenter la ligne
 Tester le nouvel identifiant (changer id dans setup)
 Decommenter la ligne sous "Mettre baudrate a 500k" avec id=votre nouvel identifiant
 Televerser vers l'AX12
 Recommenter la ligne
 Modifier BioloidController(1000000) par BioloidController(500000)
 Tester l'AX12
 */

//Biblio AX12 Arduino
#include <ax12.h>
#include <BioloidController.h>
#include <SoftwareSerial.h>
#include <Arduino.h>
int pos1;    // position ini AX12 
int pos2;    // position fin AX12 
int id;     // Identifiant AX12
int newID; //New identifiant AX12
int intel;
int registre;

//String myString;
//Initialisation de la communication
//Une fois le baudrate d'un AX12 modifié, changer la valeur contenue dans BioloidController() 
// avec une valeur à : 1000000 ça fonction
//test avec 9600, fonction pas
BioloidController bioloid=BioloidController(1000000);
//RX TX
SoftwareSerial toto(10, 11);
void setup()
{
  pinMode(13, OUTPUT);
  // position min = 0 max = 1023
  pos1 = 0;
  pos2 = 1000;
  id = 1;
  newID=1;
  intel = -1;
  toto.begin(9600);
}

void loop()
{
  digitalWrite(13,HIGH);

  //sSetPosition(id,pos1); //Changment position 
  //intel = ax12GetRegister(1, 3 ,1);//id,regist
  delay(3000);
  registre = 33;
  intel = ax12GetRegister(1, registre ,1);//id,registre,longeur
  sendReg();

  /*sendReg(intel,3);
  digitalWrite(13, LOW);
  SetPosition(id,pos2); //Changment position 
  intel = ax12GetRegister(1, 3 ,1);//id,regist
  
  sendReg(intel,3);
  delay(3000);*/

}
void sendReg(){
    String myStrings ="La valeur lu au registre  "+ String(registre) + " est "+ String(intel) + "\n";
  for (int i = 0; i < myStrings.length(); i++)
  {
    toto.write(myStrings[i]);   // Push each char 1 by 1 on each loop pass
  }

}

Et voici celle qui reçoit :

//Receiver Code
#include <SoftwareSerial.h>
SoftwareSerial mySerial(11, 10); // RX, TX

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

void loop() {
  int i;
char str[200];

  if (mySerial.available()) {
    for(i = 0;i<200;i++){
    delay(100); //allows all serial sent to be received together
      str[i] = mySerial.read();

      }
            //str[i++]='\0';
        Serial.println(str);
    
    //Serial.println(mySerial.read());
  }
  }

Voila ce que recois à la première reception :
La valeur lu au registre 33 est 0
La valeur lu au registre 33 est 0
La valeur lu au registre 33 est 0
La valeur lu au registre 33 est 0
La valeur lu au registre 33 est 0
La valeur lu au registre P

La deuxieme
33 est 0
La valeur lu au registr33 esLa valeur lu au registre 33 eLaP
a valeur lu au registre 33 eLa valeur lu au registre 33 esLa valeur lu au registre 33 esLa valeur lu au registre 33 eLaP

3eme
valeur lu au registre 33 esLa valeur lu au registre 33 eLa valeur lu au registre 33 eLa valeur lu au registre 33 eLa valeur lu au registre 33 esLa valeur lu au registre 33 eLa valeur lu au regiP
stre 33 esLa valeur lu au registre 33 esLa valeur lu au registre 33 La valeur lu au registre 33 e0La valeur lu au registre 33 eLa valeur lu au registre 33 esLa valeur lu au registre 33 eLa valeP

Je devrais juste recevoir “La valeur lu au registre 33 es 0” mais ça ne fonction pas bien et je ne vois pas trop où ça coince.
Merci d’avance.

En gros ça c’est n’importe quoi… avez vous envoyé 200 caractères?

 if (mySerial.available()) {
    for(i = 0;i<200;i++){
    delay(100); //allows all serial sent to be received together
      str[i] = mySerial.read();

      }

il faut refaire la boucle en attendant 1 caractère, le lire et le ranger dans le buffer et vérifier si c’est le ‘\n’ que vous avez envoyé à la fin de la chaîne. à ce moment là vous savez que vous avez reçu un message complet. Ou alors vous pouvez (si vous ne vous souciez pas du message) simplement imprimer les caractères quand ils arrivent, un par un…


    delay(100); //allows all serial sent to be received together

Ne JAMAIS faire cela avec une communication série… pendant que vous trainez, l’autre côté remplit le buffer et après 64 caractères vous commencez à en perdre…


ça par contre ce n’était pas une mauvaise idée parce que votre buffer n’est pas terminé par un ‘\0’ et donc vous ne pouvez pas utiliser les fonctions d’impression… pourquoi l’avoir commenté…

//str[i++]='\0';

sinon côté émetteur

j’ai l’impression que vous avez un Arduino Mega 2560… il a 4 port séries en matériel… pourquoi utiliser Sofwtare Serial qui alourdit votre code? prenez Serial1, Serial2 ou Serial3 au lieu de toto…

vous devriez vous passer des Strings (la classe avec un grand S qui morcelle votre petite mémoire de 2k sur votre arduino). utilisez simplement un buffer de caractère ou faites des toto.print() puisque de toutes façons vous envoyez de l’ascii…

void sendReg(){
   toto.print(F("La valeur lue au registre ")); // F("message") c'est pour mettre "message" en espace programme plutôt que dans la RAM. cf PROGMEM https://www.arduino.cc/en/Reference/PROGMEM
   toto.print(registre);
   toto.print(F(" est "));
   toto.print(intel); 
   toto.print("\n"); // pour marquer la fin de la ligne. ou toto.println(); qui enverra alors "\r\n"
}

Bonjour,
Merci pour toutes ces informations.
Le buffer de taille 200 c'était pour être sur d'avoir la place d'envoyer mon message puisque en faite je ne sais pas d'avance combien je reçois donc je me disais que créer un grand buffer ça marcherait peut être.
Je vais voir pour imprimer caractère à caractère dans un premier temps. Apres peut être utiliser un tableau de caractère sans taille fixe.

L'idée du buffer assez grand est bonne mais là tel que c'est codé vous lisez 200 caracteres même si vous n'en avez pas envoyé 200... vous voyez le soucis?