Bonjour, dans un de mes projets HF je voudrais isoler des chiffres :
j'ai un transmetteur qui envoi via le HC12 un chiffre basé sur 13 chiffres : C pppp tttt zzzz
double code : 1 8888 9999 6666
je voudrais pouvoir dans le récepteur isoler les chiffres correspondant aux 4 variables (C, P, T, Z)
double code : 1 8888 9999 6666
avec :
Num Caméra int C : 1
Position pan int P : 8888
Position tilt int T : 9999
zoom int Z : 6666
Pour faire ça, la solution dépend du type de variable dans laquelle tu mets ce que tu reçois.
Si c'est une String (S majuscule) tu peux utiliser les méthodes de la classe String, pour chercher les espaces, isoler les groupes de caractères entre les espaces et les transformer en nombres.
Si c'est un tableau de char, c'est un peu plus compliqué mais le principe reste le même.
si c'est un tableau de char (cString) et que vous n'avez pas de souci de place mémoire, vous pouvez utiliser sscanf(), sinon un parcours avec strtok() et atoi() ou atol() permet de lire les valeurs.
char message[100];
void receptionMessage()
{
strcpy(message, "1 8888 9999 6666");
}
void setup() {
int C, P, T, Z;
Serial.begin(115200);
receptionMessage(); // on simule la réception du message
Serial.println(F("\n----- AVEC sscanf() ------"));
if (sscanf(message, "%d %d %d %d", &C, &P, &T, &Z) == 4) {
Serial.print(F("C=")); Serial.println(C);
Serial.print(F("P=")); Serial.println(P);
Serial.print(F("T=")); Serial.println(T);
Serial.print(F("Z=")); Serial.println(Z);
} else {
Serial.println(F("Erreur de format pour sscanf()"));
}
// en utilisant strtok() pour parcourir le buffer d'espace en espace
// attention ça détruit le contenu du buffer
Serial.println(F("\n----- AVEC strtok() ------"));
char* ptr = strtok(message, " ");
if (ptr) C = atoi(ptr);
ptr = strtok(NULL, " ");
if (ptr) P = atoi(ptr);
ptr = strtok(NULL, " ");
if (ptr) T = atoi(ptr);
ptr = strtok(NULL, " ");
if (ptr) Z = atoi(ptr);
if (ptr) {
Serial.print(F("C=")); Serial.println(C);
Serial.print(F("P=")); Serial.println(P);
Serial.print(F("T=")); Serial.println(T);
Serial.print(F("Z=")); Serial.println(Z);
} else {
Serial.println(F("Erreur de format pour strtok()"));
}
}
void loop() {}
le moniteur série (à 115200 bauds) affichera
[color=purple]
----- AVEC sscanf() ------
C=1
P=8888
T=9999
Z=6666
----- AVEC strtok() ------
C=1
P=8888
T=9999
Z=6666
[/color]