Recevoir plusieurs données en même temps via le port série. Max/Msp à Arduino

Ahhhh. merciiiii :wink: ça fonctionne parfaitement!

J'ai du réécrire votre programme car sinon rien s'affichait, j'ai dû me passer de bool messageRecu()

je reçois correctement les infos et dans max/msp il faut que je retourne à la premiere méthode de câblage sprintf.

Message : 159 137 109 80 88 0
0
0
0
0
Message : 159 137 109 78 88 0

Hyper content que ça fonctionne, je commençais à désespérer.
Par contre, je comprends pas pourquoi la DEL clignote quand je module un curseur ?
le code réécrit ci dessous

const byte tailleMessage = 5;
byte valeurs[tailleMessage + 1];

void setup() {
 Serial.begin(115200);
  SerialUSB.begin(115200);
}

void loop() {
  static byte indice = 0;
  bool messagePret = false;
    if (Serial.available() > 0) {
    valeurs[indice++] = Serial.read();
    if (indice == tailleMessage) {
      indice = 0;
      messagePret = (valeurs[tailleMessage] == 0x80); // on vérifie qu'on a reçu le séparateur
      SerialUSB.print("Message : ");
      for (byte i = 0; i < tailleMessage; i++) {
      SerialUSB.print(valeurs[i]);
      SerialUSB.write(' ');
    }
    }
    SerialUSB.println( messagePret);
    }
}

/*
fonction bool messageRecu() inutilisée et réécrite dans void loop()
bool messageRecu() {
  static byte indice = 0;
  bool messagePret = false;
  if (Serial.available() > 0) {
    valeurs[indice++] = Serial.read();
    if (indice == tailleMessage) {
      indice = 0;
      messagePret = (valeurs[tailleMessage] == 0x80); // on vérifie qu'on a reçu le séparateur
    }
  }
  return messagePret;
}
*/

alors c'est que le 80 qui était envoyé n'était pas un séparateur


il y a toujours quelque chose de louche dans votre montage qui émet vers Serial

essayez cela:

void setup() {
  Serial.begin(115200);
  SerialUSB.begin(115200);
}

void loop() {
  if (Serial.available() > 0) SerialUSB.println(Serial.read());
}

il faut nous donner à la fois ce qu'imprime l'ordinateur et ce qu'imprime l'arduino pour comprendre la correspondance.

En nettoyant, simplifiant mon patch max/msp, j'ai l'impression que ça facilite les choses
voilà ce que j'ai dans Arduino

17
24
32
4
8
17
24
32
4
8
17
24
34

et ce que je print depuis max

print: 4 8 17 24 32
print: 4 8 17 24 34

Je suis sincèrement désolé, je comprends pas pourquoi mon patch Max/msp envoyait des données erratiques. Mais maintenant que j'envoie " bien " 24 données ces dernières sont mal reçues.

En fait quand je recommence le test plusieurs fois, les données que je reçois sont décalées. :frowning:
le monitor de l'Arduino print les premières données à 0.

1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 200
10 175
11 107

Peut etre est ce un problème de l'Arduino Due ? il faudrait forcer l'index 0 à lire l'info zero et l'index 23 à lire l'info 23.

Voilà mon programme

int position;

void setup() {
  Serial.begin(115200);
  SerialUSB.begin(115200);
}

void loop() {
  if (Serial.available() > 0)
  {
  position+=1;
   position = position%24;
   SerialUSB.print(position);  SerialUSB.print(" "); SerialUSB.println(Serial.read());
   }
}

voilà ce que j'envoie

print: 210 175 107 103 70 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 142
print: 200 175 107 103 70 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 142

et ce que je reçois dans Arduino.

19 0
20 1
21 2
22 3
23 4
0 5
1 6
2 7
3 8
4 9
5 0
6 1
7 2
8 142

idéalement il faudrait envoyer les trames avec un format qui permet de se synchroniser.

Le souci pour le moment c'est que vous communiquez en binaire et donc ça complique le passage d'un marqueur de début et de fin de trame (si vous n'avez pas de chance, les valeurs des curseurs pourraient donner ces marqueurs). Il existe des techniques pour cela mais ça nécessite de traiter les données à envoyer, je ne sais pas ce qui est faisable dans un patch Max/msp.

vous pouvez montrer ce patch?

Merci pour votre implication. C'est hyper sympathique, j'essayerai d'etre redevable!

Voila ce queça imprime en touchant les 3 curseurs en commençant par la droite

print: 0 1 2 3 53
print: 0 1 2 3 61
print: 0 1 2 3 63
print: 0 1 2 3 65
print: 0 1 2 37 65
print: 0 1 2 45 65
print: 0 1 61 45 65

l'objet pak 0 1 2 3 4 envoie par défaut 0 1 2 3 4

Aussi il me semble qu'avec un ancien patch qui envoyait un zero au saut de ligne, votre programme fonctionnait, les données étaient bien placées. J'ai teste plein de patch Max/msp ,mais rien à faire, ca fonctionne plus. J'ai du avoir un coup de chance que les données soit synchronisées dès le debut !

Que se passe t il si vous mettez qu’un seul %ld dans le sprintf puisque vous passez une liste par pak ?

Bonjour.
Merci encore pour votre aide!
En repartant de zero avec mon patch max/msp et grâce à votre programme, j'arrive à recevoir les 24 données dans le bonne ordre. :grinning:
Je les transformé pour qu'il puissent lire des float.
Mais en fait les données sont arrondis

Message : 20.00 61.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
Message : 20.00 61.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
Message : 21.00 61.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
Message : 21.00 61.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
Message : 21.00 61.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 

Pourtant depuis max/msp, j'envoie ceci

print: 20.236 61. 0.3 0.4 0.5 0.1 0.2 0.3 0.4 0.5 0.1 0.2 0.3 0.4 0.5 0.1 0.2 0.3 0.4 0.5 0.1 0.2 0.3 0.4
print: 20.774 61. 0.3 0.4 0.5 0.1 0.2 0.3 0.4 0.5 0.1 0.2 0.3 0.4 0.5 0.1 0.2 0.3 0.4 0.5 0.1 0.2 0.3 0.4
print: 21.312 61. 0.3 0.4 0.5 0.1 0.2 0.3 0.4 0.5 0.1 0.2 0.3 0.4 0.5 0.1 0.2 0.3 0.4 0.5 0.1 0.2 0.3 0.4
print: 21.312 61. 0.3 0.4 0.5 0.1 0.2 0.3 0.4 0.5 0.1 0.2 0.3 0.4 0.5 0.1 0.2 0.3 0.4 0.5 0.1 0.2 0.3 0.4
print: 21.851 61. 0.3 0.4 0.5 0.1 0.2 0.3 0.4 0.5 0.1 0.2 0.3 0.4 0.5 0.1 0.2 0.3 0.4 0.5 0.1 0.2 0.3 0.4

Est possible d'avoir des données précises? car il faudra que je puisse les transformer en unit32.

Voila le code Arduino

const double tailleMessage = 24;
double valeurs[]= { .1, .2, .3, .4, .5, .1, .2, .3, .4, .5, .1, .2, .3, .4, .5, .1, .2, .3, .4, .5, .1, .2, .3, .4}; // 24 float

void setup() {
  Serial.begin(115200);
  SerialUSB.begin(115200);
}

void loop()
 {
  static int indice = 0;
  bool messagePret = false;
    if (Serial.available() > 0) {
    valeurs[indice++] = Serial.read();
    if (indice == tailleMessage) {
      indice = 0;
     // messagePret = (valeurs[tailleMessage] == 0x80); // on vérifie qu'on a reçu le séparateur
      SerialUSB.print("Message : ");
      for (int i = 0; i < tailleMessage; i++) {
      SerialUSB.print(valeurs[i]);
      SerialUSB.write(' ');
    }
    SerialUSB.println();
    }
   // SerialUSB.println( messagePret);
    }
}

A regarder la doc ils disent que tout les nombres sont transformés en entier sur un octet - donc une valeur entre 0 et 255

Il faudrait générer la représentation textuelle (ASCII) de votre liste d’abord côté Max puis l’envoyer pour décodage à l’arduino.

regardez du côté de prepend

on dirait que ça fabrique la représentation textuelle

3969931b0877ba99570c0aa68b9ee023