Envoie valeur via liaison série

Bonjour à tous,

Je viens quérir votre aide pour un projet.

J'essai de créer un programme qui va me permettre d'envoyer une valeur décimale et de la recevoir de l'autre côté via la liaison série (vous allez me dire que c'est simple :P).

Programme d'émission:

byte v = 2; //vitesse

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

void loop()
{
  Serial.println(v, DEC); //je veux envoyer la valeur en décimal pour la recevoir en décimal à la réception
  delay(500);
}

Programme de réception:

int carlu = 0;

void setup()
{
  Serial.begin(9600);
}
void loop ()
{
  if(Serial.available() > 0)
   {
      carlu = Serial.read()- '0'; //lecture du premier caractère disponible, j'ai lu sur un autre post qu'il va mettre ca pour que l'info soit traduit du code ASCII en décimal
     
      Serial.print("la vitesse est : ");
      Serial.println(carlu, DEC);   
   }
}

Mais je ne comprends pas pourquoi, lorsque j'ouvre le moniteur série je reçois ca: la vitesse est : 2 la vitesse est : -35 la vitesse est : -38 la vitesse est : 2 etc

Comment pourrais je modifier ce résultat?

Merci :)

tu veux juste envoyer des 2 ? :astonished:

Salut,

Normal, tu fais println() à l'émission donc la fin de ligne + retour chariot s'ajoute à la trame, d'où les -35 et -38. read() ne lit qu'un seul caractère au passage

B@tto: Salut,

Normal, tu fais println() à l'émission donc la fin de ligne + retour chariot s'ajoute à la trame, d'où les -35 et -38. read() ne lit qu'un seul caractère au passage

Le plus simple serait de n'envoyer qu'un caractère en utilisant print() au lieu de println()

Bonjour,

Ça fonctionne très bien avec la fct print().

Maintenant j’aimerais envoyer plusieurs informations (environ 5 variables).
J’ai le programme d’émission, mais je ne sais pas si je dois utiliser une boucle avec une architecture “normale” ou un tableau.
Voici mes deux programmes:

  1. avec le tableau:
int index;//permet de parcourir le tableau
char deb_trans[] = "start";//début de la transmission série
  /* -------L'INSTRUCTION "BYTE" N'ENVOIE QUE DES NBR ENTIERS----------*/

byte vitesse = 12; // déclare la vitesse à 12,8 Km/h
byte courant = 10; // déclare le courant à 10A
void setup() //initialisation 
{
  Serial.begin(9600); //on démarre la liaison en choisissant une vitesse de transmission de 9600 bauds
}

void loop() //création d'une boucle infinie 
// on va envoyer les variables du tableau sur le port série
{
    Serial.print(deb_trans);//on envoie l'information de début de transmission "start"
    for (index=0; index <=1; index++){
      Serial.print(variables[index]); //on envoie les valeurs du tableau une par une
      delay(500);//attente de 500mS entre chaque caractère
    }
}
  1. architecture “normale”:
byte v = 2; 
//déclaration variable i, pour le courant
byte i = 13;
//initialisation de la liaison 
void setup()
{
  Serial.begin(9600);
}
//lancement d'une boucle
void loop()
{
  Serial.print(v);
  delay(500);
  digitalWrite(v , DEC);
  Serial.print(i);
  delay(500);
  digitalWrite(i , DEC);
}

Mais j’ai un problème pour la réception j’ai essayé ce genre de programme mais sans résultat:

//déclaration d'une variable
byte carlu = 0;
//initalisation 
void setup()
{
  Serial.begin(9600);
}
//création d'une boucle infinie
void loop()
{ 
  if(Serial.available() > 0)
  {
    carlu = Serial.read()- '0';
    Serial.println(carlu);
    Serial.flush();
    if(carlu == 50)
    {
      digitalWrite(carlu , DEC);
      Serial.print("la vitesse est de ");
      Serial.flush();
    } 
    
    else if(carlu == 49)
    digitalWrite(carlu , DEC);
    Serial.print("le courant est de ");
    Serial.flush();
  }
}

Quel programme choisir pour la réception et comment pourrais je améliorer mon programme de réception?

Merci :slight_smile:

La méthode la plus simple serait d’utiliser un tableau pour l’émission :

byte tab[5] = {4,5,3,2,77 }; //déclaration du tableau
int i; // et du compteur
void setup()
{
  Serial.begin(9600); 
}
void loop()
{
   for(i=0; i<=4; i++)
   {
      Serial.println(tab[i]);
      delay(500); 
   }
}

Et pour la réception :

byte recue;
void setup()
{
  Serial.begin(9600); 
}
void loop()
{
  while(Serial.available()) // tant qu'il y a quelque chose à lire
  {
      recue = Serial.read(); //on lie le caractère reçut
      Serial.println(recue); // on affiche
      delay(500);
  }
}

Je vois pas trop pourquoi s’embêter avec ces delay(500) et avec print() si c’est pour transmettre des valeur < à 255

Emission :

byte tab[5] = {4,5,3,2,77 }; //déclaration du tableau
int i; // et du compteur
void setup()
{
  Serial.begin(9600); 
}
void loop()
{
   for(i=0; i<=4; i++)
   {
      Serial.write(tab[i]);
   }
}

Réception :

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

void loop()
{

if(Serial.available()) {

delay(5);

byte buffer[10];
byte i=0;

  while(Serial.available()) buffer[i++]=Serial.read();

// fait ce que tu veux avec les données dans buffer[]

}

}

Salut les gars merci pour votre aide,

@alex: lorsque je met en oeuvre tes programmes voilà ce que le moniteur série affiche: 55 55 13 10 52 13 10 53 13 10 51 13 10 50 13 10 55 55

Les valeurs reçues sont différentes de celles envoyées.

@batto: je ne comprends pas trop ton code de réception, comment pourrais je affichées les informations envoyées ? Je ne comprends pas cette ligne while(Serial.available()) buffer[i++]=Serial.read();, c'est bien: tant qu'il y a une valeur dans le buffer alors on affiche cette valeurs ?

Merci

Ce qu'il affiche c'est le résultat de

77\r\n 4\r\n 5\r\n 3\r\n 2\r\n 77

\r et \n sont les caractères 13 et 10, qui constituent le saut de ligne.

Si tu utilisais char au lieu de byte, tu aurais le caractère et non sa valeur numérique affichée dans le moniteur série

Salut,

@xaviermiller : merci pour ton information je me suis rendu compte de mon erreur :)

Pour ce qui est du code j'en ai trouvé un qui fonctionne parfaitement (pour l'instant), il n'est peut être pas bien optimisé ni jolie à regarder mais il fonctionne (c'est le principal non ? :p )

Emission :

//EMISSION SERIE PLUSIEURS VALEURS

int v = 2;
int i = 3;
int d = 4;
int u = 5;
int p = 6;
int e = 7;


void setup()
{
  Serial.begin(9600);
}
void loop()
{
  Serial.print(v, DEC);
  delay(500);
  Serial.print(i, DEC);
  delay(500);
  Serial.print(d, DEC);
  delay(500);
  Serial.print(u, DEC);
  delay(500);
  Serial.print(p, DEC);
  delay(500);
  Serial.print(e, DEC); 
  delay(500);
}

Réception :

//RECEPTION DE 2 VALEURS

int carlu = 0;
//initalisation 
void setup()
{
  Serial.begin(9600);
  Serial.print("Port serie OK");
}
//création d'une boucle infinie
void loop()
{ 
  if(Serial.available() > 0)
  {
    carlu = Serial.read()- '0';
    Serial.println(carlu, DEC);
  }
}[/code

Si vous remarquez que quelque chose ne va pas, merci de me le signaler ^^ 

Merci à tous pour votre aide,
Cordialement