Go Down

Topic: Récuper des données en Bluetooth (Read 243 times) previous topic - next topic

Brice_B

Bonjour/Bonsoir,
Voilà, j'ai 2 problème qui s'oppose à moi, je dois récupérer des données envoyer par Bluetooth, la récupération dois s'effectuer dès que je reçois un char(2), qui annonce le début de la chaine de données, et doit finir à la réception d'un char(3) qui ,du coup, met fin à la récupération des données. Mon problème est justement de lui dire de récup les données à partir de char(2) jusqu'à char(3), et mon autre problème est de les stocker en sachant qu'il y a plusieurs données entre les 2 (environ 7 à 10), je ne trouve pas comment faire.

Merci d'avance aux âmes charitables qui pourront me débloquer.

lesept

La com Bluetooth passe par une liaison série : regarde ce tuto.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Brice_B

Merci pour cette réponse, j'avais déjà lu ce post mais je n'arrive pas à l'appliquer à mon problème, si quelqu'un a une façon de bien m'expliquer comment définir le début, et fin, d'une lecture de trame, je suis preneur.

lesept

Tu l'as décrit toi même dans ton premier message :
la récupération dois s'effectuer dès que je reçois un char(2), qui annonce le début de la chaîne de données, et doit finir à la réception d'un char(3) qui ,du coup, met fin à la récupération des données.
Ta trame arrive avec des délimiteurs char(2) au début et char(3) à la fin. Qu'est ce que c'est pour toi ce char(2) et char(3) ?
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Brice_B

Char(2) c'est le début de ma trame, STX (Start of Text) en ASCII, en inversement pour Char(3) (ETX, End of text).

Pour le dire differement, quand je veux faire un, par exemple,

if (debutTrame == char(2))

il ne va pas comprendre, il veut que je le mette comme si c'etait du texte.

hbachetti

Il faut que tu mettes en place un automate (un simple switch/case), avec un état, un buffer, un index (longueur).


Code: [Select]


#define ST_IDLE             0
#define ST_STX_RECEIVED     1
#define ST_ETX_RECEIVED     2
#define LENGTH              16     // à dimensionner

int state = ST_IDLE;
int length;
char buf[LENGTH];

void setup() {
  // put your setup code here, to run once:

}

int receive(void)
{
  // ta fonction de réception d'un caractère
}

int execute(const char *cmd)
{
  // ta fonction d'exécution de commandes
}

void loop() {
  int c = receive();
  switch (c) {
    case 2:
      length = 0;
      state = ST_STX_RECEIVED;
      break;
    case 3:
      state = ST_ETX_RECEIVED;
      break;
    default:
      if (length < LENGTH) {
        buf[length++] = c;
      }
      break;
  }
  if (state == ST_ETX_RECEIVED) {
    execute(buf);
    state = ST_IDLE;
 }
}


Tu vois ou pas ?
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Brice_B

Ah, je n'avais pas penser à ça comme ça !
Merci je vais tester.

hbachetti

C'est comme cela que l'on bâtit un protocole en général.

STX = 2 et ETX = 3 sont de bons choix, c'est standard. C'est un bon départ.

Ensuite si dans les données il y a du binaire, il va falloir penser à DLE (mode transparent).

Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Go Up