Incompréhension transfert de valeurs par le port serie

Bonjour a tous après BEAUCOUP de recherches personnelles, j'en suis arrivé à la conclusion que je ne comprends rien au port Série !
J'ai besoin de votre aide, jute pour comprendre comment envoyer et recevoir, correctement, des données par le port série:
1 MEGA 1280 envoie par liaison série (sans fil) à un MEGA 2560 un array de 4 valeurs.
le MEGA 2560 les envoi sur le port Série relié au PC, le PC les affiche dans le terminal (Ctrl Maj M).
Code de l'émetteur:

// Mega 1280  EMETTEUR

char Valeurs[4] = {'A','B','C','D'};
int Start = 2;
void setup()
{
Serial1.begin(9600);
pinMode (Start, HIGH);
}
void loop()
{
  if (digitalRead (Start) == HIGH){
    for (int i=0 ; i == 5 ; i++){
      if (i == 5){
        Serial1.println();
        break;
      }
      Serial1.print (Valeurs[i]);
      delay (100);
     }
  }
}

code du récepteur:

// MEGA 2560 RECEPTEUR
char Valeurs[4];
char Temp = 0;
void setup()
{
Serial1.begin(9600);
Serial.begin(9600);
}
void loop()
{
  for(int i=0 ; i==4 ; i++)
  {
   Valeurs[i] = Serial1.read ();
   Serial.println (Valeurs[i]);
   delay (100);
  }
}

Si quelqu'un pourrait me dire:

  • Pourquoi je ne reçois rien sur le terminal Série du PC ?
  • Est ce que si je vois inscrit (sur le terminal du PC) : A , le MEGA 2560 verra, lui aussi un A ?
  • N'y a t'il pas quelques règles à respecter pour l'envoi et la réception de valeurs par le port Série ?

Merci à vous

Olivier

Salut
Tiens regarde là : http://fr.openclassrooms.com/informatique/cours/apprenez-a-programmer-en-c/parcourir-un-tableau-1

Le problème c'est tes boucles FOR !
Tu mets "==" au lieu de "<"

Pour compléter le propos de chabot380
La seconde expression dans le for est évaluée au début de chaque itération de la boucle. Cette expression doit être évaluée à vrai pour que la boucle s'exécute.
Dans ton cas la condition est fausse à l'entrée dans la boucle donc le for ne l'exécute jamais.

Merci pour vos réponses, j'ai compris les boucles FOR !!!
J'ai modifié le code, les boucles s'executent, par contre les données renvoyées sur le terminal du PC ressemblent à " ÿ " !!!
Rien à voir avec ce que j'ai envoyé.

  • Est ce que le MEGA 2560 interprète bien 'A' ???
  • Pourquoi la valeur renvoyée est " ÿ " ???

Merci de votre aide !

Olivier

EMETTEUR

// Mega 1280  EMETTEUR

char Valeurs[4] = {'A','B','C','D'};
int Start = 2;
void setup()
{
Serial1.begin(9600);
pinMode (Start, HIGH);
pinMode (2, OUTPUT);
}
void loop()
{
  digitalWrite (2, HIGH);
//  if (digitalRead (Start) == HIGH){
    for (int i=0 ; i < 6 ; i++){
      if (i == 5){
        Serial1.println();
        break;
      }
      Serial1.println (Valeurs[i]);
      delay (100);
     }
//  }
}

RECEPTEUR:

// MEGA 2560 RECEPTEUR
char Valeurs[4];
char Temp = 0;
void setup()
{
Serial1.begin(9600);
Serial.begin(9600);
}
void loop()
{
  for(int i=0 ; i < 5 ; i++)
  {
   Valeurs[i] = Serial1.read ();
//   Serial.print ("DECIMAL:  ");
//   Serial.println (Valeurs[i], DEC);  // print as an ASCII-encoded decimal
//   Serial.print ("HEXA:  ");
//   Serial.println (Valeurs[i], HEX);  // print as an ASCII-encoded hexadecimal
//   Serial.print ("OCTAL:  ");
//   Serial.println (Valeurs[i], OCT);  // print as an ASCII-encoded octal
//   Serial.print ("BINAIRE:  ");
//   Serial.println (Valeurs[i], BIN);  // print as an ASCII-encoded binary
//   Serial.print ("RAW:  ");
   Serial.println (Valeurs[i],DEC);
   delay (250);
  }
}

Avant de faire un Serial.read() il faut faire un while(!Serial.available()); pour s'assurer qu'un caractère est arrivé.

Merci pour la remarque,

mais cela n'a rien changé, je reçois toujours " ÿ ", sur le terminal Série du PC

obel38:
Merci pour la remarque,

mais cela n'a rien changé, je reçois toujours " ÿ ", sur le terminal Série du PC

bonjour
le " ÿ " reçu est souvent le symptome d(une liaison serie mal paramétrée (vitesse,start,stop,parité)
tu dis plus haut que tu transmet sans fil, c'est quoi ton equipement d'emission reception ? (references)

Je transmet avec une paire d'APC220, par contre, les essais effectués, sont faits avec une liaison filaire entre les 2 MCU (Tx-Rx et GND)

Toutes les liaisons séries sont faites à 9600 Bauds.

Après, dans le terminal Série (No line Ending 9600 Bds / Autoscroll)

Merci

ÿ = 255 = -1 = EOF = pas de données ?

Bonjour les amis,
Je profite de ce sujet (En espérant ne pas léser son auteur) pour poser une question qui concerne précisément la ligne série.
Je sais comment donner des ordre à Arduino pas simples caractères envoyés sur la ligne série, mais comment lui envoyer une valeur numérique qui sera alors imposée à une quelconque variable ?

Bonjour
Remets ton code corrigé pour voir ! :astonished:

nulentout:
Bonjour les amis,
Je profite de ce sujet (En espérant ne pas léser son auteur) pour poser une question qui concerne précisément la ligne série.
Je sais comment donner des ordre à Arduino pas simples caractères envoyés sur la ligne série, mais comment lui envoyer une valeur numérique qui sera alors imposée à une quelconque variable ?

Deux options :

  • en binaire : la tu récupère vraiment la valeur de chaque byte et ça necessite à l'envoi de bien décomposer en byte. Pour la réception on le fait dans des integer.
  • en ASCII : si tu veux te simplifier la tâche il y a les fonctions type atof() (array to float) atol (array to long ) ... Mais qui ne comporte pas de vérification d'erreur. Si tu veux plus évolué il faut utiliser strtol (string to long, malgré son nom il faut l'utiliser sur des char array :wink: ) etc ... mais moins simple à mettre en place. Dans tous les cas il suffit au préalable de réceptionné tes données série dans un tableau de char.