Chaines de caractèrs String

Bonjour,

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);

}

PS:HOST_LINK = Serial

Salut,

Fonction strtol() : http://www.cplusplus.com/reference/cstdlib/strtol/

Merci, aurais tu un exemple d'utilisation avec mon problème ?

B@tto:
Salut,

Fonction strtol() :
strtol - C++ Reference

ç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.

Ok, je vais tester ça maintenant

Merci

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

@b@tto

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)