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.
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.
Tu l'as décrit toi même dans ton premier message :
Brice_B:
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) ?
Il faut que tu mettes en place un automate (un simple switch/case), avec un état, un buffer, un index (longueur).
#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;
}
}