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
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
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()
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:
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
}
}
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?
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[]
}
}
@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 ?
@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 ? )
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