Go Down

Topic: Envoie valeur via liaison série (Read 2594 times) previous topic - next topic

petitou

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:

Code: [Select]
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:
Code: [Select]
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 :)

Hubhub


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
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

fdufnews


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()

petitou

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:

Code: [Select]
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
    }
}


2) architecture "normale":
Code: [Select]
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:
Code: [Select]
//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 :)

alex877

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

Code: [Select]

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 :
Code: [Select]

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);
  }
}

B@tto

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

Emission :

Code: [Select]
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 :

Code: [Select]
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[]

}

}
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

petitou

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
Code: [Select]
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

XavierMiller

#8
May 28, 2014, 02:53 pm Last Edit: May 28, 2014, 02:57 pm by XavierMiller Reason: 1
Ce qu'il affiche c'est le résultat de
Quote
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

petitou

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 :
Code: [Select]
//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 :
Code: [Select]
//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

Go Up