Pages: [1] 2   Go Down
Author Topic: communication série entre deux Arduino  (Read 4317 times)
0 Members and 1 Guest are viewing this topic.
Geneva
Online Online
Faraday Member
**
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

J'ai branché deux plaques Arduino par les pins rx-tx, en croisant les fils, les deux sont sur le même Gnd.

la première plaque m'envoit :

Code:

...
 Serial.print ("   time ");
  Serial.print (millis(),DEC);
  Serial.print ("   rpm ");
  Serial.print(rpm,DEC);
  Serial.print ("   pos ");
  Serial.print (encoderpos,DEC);
  Serial.print ("   index ");
  Serial.print (index,DEC);
  Serial.println ("\0");
...


Et la deuxième a ce code:

Code:
int incomingByte ;      
char myStr[100];


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

void loop() {

      Serial.print("I received: ");
      while (Serial.available() > 0) {
            
 for (int i = 0; i < sizeof(myStr) - 1; i++)
 {
  incomingByte = Serial.read();
   myStr[i]=incomingByte;
   Serial.print(myStr[i]);
}
}
}


Ensuite j'envoie les valeurs sur le serial monitor.
Les valeurs s'affichent correctement comme ce qui sort de la première plaque, la mention "I received: " ne s'affiche qu'une fois, ce qui indique que je suis enfermé dans la boucle While et que même avec le '\0' je n'en sort pas...

Ce qui me préocuppe pour le moment c'est que je n'arrive pas à récupérer les données du flux reçu afin de les convertir en variable exploitable.

J'aimerais par exemple pouvoir utiliser la valeur des t/min mais je n'arrive pas à séparer cette valeur du reste du flux.
En plus comme les valeurs varient et passent d'unités à dizaines, centaines, ça ne facilite pas.

J'ai essayé plusieurs choses différentes (que je ne poste pas car c'est totalement inexploitable).
« Last Edit: March 15, 2009, 07:19:47 am by jfs » Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

0
Offline Offline
Full Member
***
Karma: 0
Posts: 198
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Le problème je pense c'est que la liaison USB utilise déjà la liaison série de l'Arduino, du coup l'utiliser pour communiquer avec l'ordi et avec une autre Arduino ça doit pas le faire
Logged

Geneva
Online Online
Faraday Member
**
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Si,si, ça fonctionne (du moins dans ce cas), ce qui est affiché est exactement similaire si je suis directement sur celle qui lit la roue codeuse ou si j'ai la deuxième plaque en intermédiaire.
Mon problème réside surtout dans le fait que je ne sais pas  comment convertir le flux (string ?) en un valeur ( int, long..) exploitable.

Pour l'instant ça ne fait qu'aligner les bytes tels quels, j'aimerais pouvoir les remettre dans la même configuration qu'avant l'envoi.
« Last Edit: January 07, 2013, 01:54:20 pm by Jean-François » Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Geneva
Online Online
Faraday Member
**
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Dans mes essais actuels j'essaye de séparer les valeurs qui m'intéresse en les envoyant entre des balises.
Par exemple, la valeur "time" envoyée par Arduino-1 est précédée par 'T' et suivie de 'U'.

Je pensais la séparer du reste en utilisant un code comme cela :

Code:
char time;
char value;

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

void loop() {

  while (Serial.available() > 0) {
    
    value = Serial.read();
    
    if (value =='T'){
      while (value !='U'){
        value = Serial.read();
        time = value;
        if (value !='U'){
        Serial.print(time);
        }
      }
      Serial.println();
    }
  }
}



Pour ensuite mettre la valeur "time" dans un tableau dont j'additionnerais les "cases" en le lisant depuis la fin en multipliant par 1000, 100, 10 suivant la position du chiffre dans la valeur affichée à la fin.

Pour l'instant j'ai bien la valeur "time" qui s'affiche selon la progression de millis(), mais les chiffres sont précédés de trois " ÿ " comme cela :

Code:
ÿÿÿ641735
ÿÿÿ641752
ÿÿÿ641769
ÿÿÿ641786
ÿÿÿ641804
ÿÿÿ641821
ÿÿÿ641838
ÿÿÿ641855
Je n'arrive pas à trouver d'où ils viennent.
Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Sophia-Antipolis (06)
Offline Offline
God Member
*****
Karma: 4
Posts: 618
Rejoignez le club !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

C'est ton println peut-être (caractère \r ou \n).
Mais je connais bien ce caractère (ÿ), je le vois souvent passer dans mes logs série, je me demande si c'est pas plutôt 0xFF
Logged

Geneva
Online Online
Faraday Member
**
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Voila le code que j'essaye actuellement sur l'Arduino-2 :

Code:
char value;
int a=0;
int b=0;
int c=0;
long time=0;
char t[15];


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

void loop() {

  while (Serial.available() > 0) {

    value = Serial.read();

    if (value =='T'){
      a=0;
      while (value !='U'){
        value = Serial.read();

        if (value !='U'){
          t[a]=value;
          Serial.print(value);
          
        }
          a++;
          b=a;
          c=a;
      }
      a=0;
      while(a < c){

        switch (b){

        case 8:
          time=+(t[a]*100000000);
        case 7:
          time=+(t[a]*10000000);
        case 6:
          time=+(t[a]*1000000);
        case 5:
          time=+(t[a]*100000);
        case 4:
          time=+(t[a]*10000);
        case 3:
          time=+(t[a]*1000);
        case 2:
          time=+(t[a]*100);
        case 1:
          time=+(t[a]*10);
        case 0:
          time=+(t[a]*1);
        }
        b--;
        a++;
      }
      Serial.print(" time   ");
      Serial.print(time);
      Serial.print(" time fin  ");
      Serial.println("stop");
      time=0;
    }
  }
}

Pour l'instant ça ne marche pas alors si quelqu'un a une correction a amener  :smiley
« Last Edit: March 17, 2009, 03:41:54 pm by jfs » Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

0
Offline Offline
Full Member
***
Karma: 0
Posts: 198
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

J'ai remarqué une choses mais ça ne change pas le fonctionnement :

Code:
char value;
int a=0;
int b=0;
int c=0;
long time=0;
char t[15];


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

void loop() {

  while (Serial.available() > 0) {

    value = Serial.read();

    if (value =='T'){
      a=0;
      while (value !='U'){
        value = Serial.read();

        if (value !='U'){   // pourquoi mettre un if ? si le while est vrai le if aussi
          t[a]=value;
          Serial.print(value);
          
        }
          a++;
          b=a;
          c=a;
      }
      a=0;
      while(a < c){

        switch (b){

        case 8:
          time=+(t[a]*100000000);
        case 7:
          time=+(t[a]*10000000);
        case 6:
          time=+(t[a]*1000000);
        case 5:
          time=+(t[a]*100000);
        case 4:
          time=+(t[a]*10000);
        case 3:
          time=+(t[a]*1000);
        case 2:
          time=+(t[a]*100);
        case 1:
          time=+(t[a]*10);
        case 0:
          time=+(t[a]*1);
        }
        b--;
        a++;
      }
      Serial.print(" time   ");
      Serial.print(time);
      Serial.print(" time fin  ");
      Serial.println("stop");
      time=0;
    }
  }
}

Par contre j'ai pas la longueur des long en tête mais est-ce que ça passe quand b = 8 ?
Sinon où est-ce que ça bloque plus précisément ?
« Last Edit: March 17, 2009, 04:44:24 pm by Vincent » Logged

Geneva
Online Online
Faraday Member
**
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Effectivement ça dépasse la capacité des long, mais normalement ça ne devrait jamais arriver jusqu'à la position 8.


J'ai un truc comme ça qui s'affiche en console :


Code:
ÿÿÿ538 time   50 time fin  stop
ÿÿÿ555 time   50 time fin  stop
ÿÿÿ571 time   50 time fin  stop
ÿÿÿ587 time   50 time fin  stop
ÿÿÿ604 time   50 time fin  stop
ÿÿÿ620 time   50 time fin  stop
ÿÿÿ636 time   50 time fin  stop
ÿÿÿ653 time   50 time fin  stop
ÿÿÿ669 time   50 time fin  stop
ÿÿÿ685 time   50 time fin  stop
ÿÿÿ701 time   50 time fin  stop


 Si je ne Reset pas la carte 1 la valeur time reste à 0.
« Last Edit: March 18, 2009, 01:31:00 am by jfs » Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Sophia-Antipolis (06)
Offline Offline
God Member
*****
Karma: 4
Posts: 618
Rejoignez le club !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Le if est nécessaire car entre le while et le if, la valeur a été changée par un nouveau read.

C'est normal que tu aies le yyy538 en début de ligne : comme tu écoutes "en espion" (j'ai oublié le terme exact) la ligne série, tu vois à la fois ce que la carte reçois et ce qu'elle envoie).
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 198
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

C'est vrai, j'avais pas fait attention à la nouvelle lecture
Logged

Geneva
Online Online
Faraday Member
**
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Le if est nécessaire, sinon le U s'affiche après la valeur "time".

En fait le 538 est normal, vu que j'affiche value aprés chaque première lecture, les y sont moins "normaux"  ;D.

Le problème que j'ai c'est qu'entre "time" et "time fin", le 50 devrait être ma valeur 538 (et suite) qui s'affiche, mais dans une seule variable.
« Last Edit: March 18, 2009, 07:40:43 am by jfs » Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Geneva
Online Online
Faraday Member
**
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

J'ai trouvé une erreur, les Compound Operators sont inversé:

Code:
     ...
           case 8:
          time=+(t[a]*100000000); // le + et = sont à inverser
        case 7:
          time=+(t[a]*10000000);  //idem
        ...


il faut corriger par :

Code:
     ...
           case 8:
          time+=(t[a]*100000000); // le + et = étaient à inverser
        case 7:
          time+=(t[a]*10000000);  //idem
        ...
« Last Edit: March 18, 2009, 07:19:06 am by jfs » Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Sophia-Antipolis (06)
Offline Offline
God Member
*****
Karma: 4
Posts: 618
Rejoignez le club !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Regarde du côté des décalages, ce serait plus pratique que tes multiplications.

Voici comment on envoit un entier (2 octets sur Arduino) sur la liaison série :

Code:
Serial.print(0xff, BYTE);
 Serial.print( (val >> 8) & 0xff, BYTE);
 Serial.print( val & 0xff, BYTE);

Et voici comment on le récupère :

Code:
while (Serial.available() >= 3) {
    if (Serial.read() == 0xff) { // le premier octet, équivalent à ton T
      val = (Serial.read() << 8) | (Serial.read());
    }
  }
Logged

Geneva
Online Online
Faraday Member
**
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Je viens de faire un essai avec tes deux bouts de code....  smiley-grin
Je me cassais les c....les pour pas grand chose...

J'ai pas tout compris  :smiley, j'ai trouvé que << sert a décaler les bits, mais ça reste compliqué à comprendre pour moi.

Serait-il possible de commenter ce que ça fait (les deux séquences complètes), j'aimerais vraiment comprendre ça.

Est-ce possible de faire la même chose pour un long ?
Il faut juste me répondre par oui-non, car si c'est faisable j'aimerais trouver par moi-même si les premiers code me sont expliqués.   smiley-wink
Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Sophia-Antipolis (06)
Offline Offline
God Member
*****
Karma: 4
Posts: 618
Rejoignez le club !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Si on doit envoyer par exemple 867, qui vaut en hexadecimal 0x0363

Code:
int val = 0x0363;
Serial.print(0xff, BYTE); // la valeur envoyée est 0xFF
Serial.print((val >> 8) & 0xFF, BYTE); // la valeur envoyée est 0x03
Serial.print(val & 0xFF, BYTE); // la valeur envoyée est 0x63

Devine quelle valeur on aura avec (val >> 4)


Logged

Pages: [1] 2   Go Up
Jump to: