Je fait une fonction pour recuperer une variable utilisateur a fin de fixer une plage d'ID pour des tag RFID ma seul question est comment recuperer la variable utilisateur sous cette forme: 0x### (### représentent la variable utilisateur en ASCII) voila le code de ma fonction:
void plageSel () {
HOST_LINK.println("debug");
while (plageMini.equals("")) {
delay(5);
HOST_LINK.println("Enter Mini Range 0x:");
plageMini = HOST_LINK.read();
}
HOST_LINK.print("Range Mini:");
HOST_LINK.println(plageMini);
while (plageMaxi.equals("")){
if (HOST_LINK.available() > 0) {
delay(5);
HOST_LINK.println("Enter Maxi Range 0x:");
plageMaxi = HOST_LINK.read();
}
}
HOST_LINK.print("Range Maxi:");
HOST_LINK.println(plageMaxi);
}
ça oblige de bâtir un buffer de charactère pour l'interpréter ensuite, ça utilise de la mémoire pour rien puisque dans le cas d'une entrée série on peut bâtir le nombre à la volée.
Voici un exemple d'une fonction qui lit un nombre Hexadécimal sur le port Serial avec un timeout de 5s. La fonction prend en paramètre un unsigned long par référence qui contiendra la valeur lue au retour de la fonction. La fonction retourne true si un nombre a été lu ou false sinon (et dans ce cas le nombre est mis à 0).
Vous pouvez taper votre nombre en hexa avec des minuscules ou majuscules, le code s'adapte grace à la fonction [url=http://www.cplusplus.com/reference/cctype/toupper/]toupper()[/url]
Mettre la console série à 115200 bauds pour que ça fonctionne of course
boolean readHexInput(unsigned long &value)
{
unsigned long startTime = millis();
const unsigned long timeout = 5000ul; // 5 secondes
boolean Numberfound = false;
value = 0;
while (true) {
if (millis() - startTime >= timeout) {
Serial.println("Timeout");
break;
}
if (Serial.available()) {
int c = Serial.read(); // retourne -1 si erreur de lecture
if (c != -1) {
if (((char) c >= '0') && ((char) c <= '9')) {
Numberfound = true;
value = 16 * value + (char) c - '0';
} else if ((toupper((char) c) >= 'A') && (toupper((char) c) <= 'F')) {
Numberfound = true;
value = 16 * value + toupper((char) c) - 'A' + 10;
} else {
// on a trouvé un caractère qui ne va pas
// c'est soit la fin de ligne soit autre chose
// si le nombre n'a pas commencé, j'igore ce caractère,
if (Numberfound) break;
}
}
}
}
return Numberfound;
}
void setup() {
Serial.begin(115200);
}
void loop() {
unsigned long v;
Serial.println("\nEntrer une valeur en Hexa:");
if ( readHexInput(v)) {
Serial.print("J'ai lu 0x"); Serial.println(v, HEX);
} else Serial.println("Pas de nombre valide");
}
la fonction ne traite pas spécialement le débordement, donc si vous entrez quelque chose qui ne tient pas dans un unsigned long le résultat est pas forcément bon.
J-M-L:
ça oblige de bâtir un buffer de charactère pour l'interpréter ensuite, ça utilise de la mémoire pour rien puisque dans le cas d'une entrée série on peut bâtir le nombre à la volée.
C'est vrai que 8 bytes y'a pas mieux pour déborder la RAM ... Mieux vaut en effet passer 3 heures à réinventer la roue
Et comment vous bâtissez votre buffer de 8 caractères? Vous le commencez où et vous le finissez où? Pourquoi 8? (Et le code ci dessus c'est tellement peu compliqué que ça prend juste le temps de le taper)