Arduino Hello World dans le moniteur série

Salut, on nous a demandé de programmer quelque chose qui, lorsque jentre quelque chose dans le moniteur série, imprime Hello world mais le hic, cest seulement imprime bonjour le monde dans les conditions que votre entrée dans le moniteur série est une entrée 3 bits et après cela, jai besoin dun code qui lempêche dimprimer encore et encore. mon seul problème est que je ne sais pas vraiment comment compter le nombre de bits dune entrée et comment lempêcher de simprimer en continu.

void setup() { Serial.begin(9600); } void loop() { String readSerial; String input; while(Serial.available() > 0){// put your main code here, to run repeatedly: delay(2); input.concat(String((char)Serial.read())); return input; } Serial.println("HELLO WORLD"); } 

Commentaires

  • Sagit-il dun devoir de classe?
  • Veuillez ajouter votre code.
  • Oui. Et cest aussi un devoir avant la leçon proprement dite
  • Quentendez-vous exactement par entrée 3 bits? Linterface série nenvoie que des octets entiers. Sagit-il de valeurs spécifiques dans 3 des 8 bits dun seul octet?
  • il est dit ici que 3 caractères prêts à être lus (octets) est-ce que 3 bits? ou est-ce que mon hypothèse est fausse?

Réponse

À en juger par les commentaires, vous avez du retard sur certaines connaissances de base. Pour vraiment apprendre ce que vous êtes censé apprendre dans ce devoir, vous devriez revoir votre matériel dapprentissage ou les didacticiels C / C ++ et Arduino sur le Web . Ici, je ne vais vous donner que quelques conseils de raisonnement, qui peuvent vous aider à résoudre la tâche des affectations. (Unfortu nately ce nest pas vraiment clair, quelle est exactement la tâche ici)

  • Linterface Serial de lArduino (une interface UART) envoie les données dans octets, un à la fois et lun après lautre (doù le nom serial). 1 octet est une série de 8 bits, chacun deux ayant une valeur de 1 ou 0. Ensemble, les 8 bits forment une valeur, qui peut également être exprimée sous forme de valeur décimale de 0 à 255. Par exemple 01001011 est léquivalent binaire du nombre décimal 75. (Pour plus dexplications google le système de nombres binaires) Les données doctets peuvent également être exprimées sous forme de caractères, tels quils sont définis dans la norme ASCII. Chaque valeur binaire fait référence à un caractère spécifique. Cest ce qui se passe dans le moniteur série de lIDE Arduino. (Pour plus dexplications google ASCII)
  • Puisque les données sont envoyées en série, il peut apparaître des retards dans la transmission, qui sont imperceptibles par les humains, mais lArduino est assez rapide, de sorte que le Serial.available() peut renvoyer 0, car à ce moment, un petit retard dans la transmission sest produit. Il est donc important de saisir tout le message avant dessayer de travailler avec. Vous pouvez le faire soit en comptant les octets (en attendant quau moins 3 octets soient disponibles dans la mémoire tampon) ou en marquant la fin du message avec un caractère spécial (par exemple le caractère de nouvelle ligne « \ n »). Il existe de nombreux tutoriels sur le Web pour faire les deux. Vous pouvez commencer par le blog de Majenko « .
  • Vous pouvez obtenir le nombre doctets reçus avec la valeur de retour Serial.available(). Il renverra 3, lorsquil y aura 3 octets prêts à être lus dans le tampon.
  • Si vous définissez une variable dans le void loop(), il sera jeté à la fin de la fonction et redéfini, lorsque la fonction redémarrera (dans le monde Arduino, la fonction void loop() est appelée encore et encore pour toujours) . Vous perdrez tout le contenu écrit dans cette variable. Si vous souhaitez conserver les données pendant les exécutions de la fonction void loop(), vous pouvez définir la variable en dehors de toute fonction en haut de votre programme. Cette variable est alors globale et ne sera définie quune seule fois au début du programme et maintenue pendant toute la durée de vie du programme.
  • Comme indiqué dans le commentaire, vous ne devez pas renvoyer de valeur à partir dune fonction void, s ince void signifie principalement quil ny a pas de valeur de retour. Et revenir de la fonction void loop() ne fera que redémarrer cette fonction (puisque nous sommes dans le monde Arduino).
  • Vous pouvez abandonner le delay(2). Il ny en a pas besoin. Et si cela ne fonctionne quavec le retard, alors quelque chose dautre nest pas correct et vous travaillez simplement avec les symptômes à la place avec le vrai problème.

De plus, vous ne devriez pas essayer de tout construire sur votre posséder et réinventer la roue. Essayez plutôt de regarder les exemples fournis avec lIDE Arduino. Par exemple, lexemple SerialEvent, qui montre comment recevoir un message série (qui se termine par un caractère de nouvelle ligne « \ n »). Jetez également un œil aux autres exemples connexes. Si vous comprenez comment ils fonctionnent, vous pourrez faire le devoir sans aucun problème.

Commentaires

  • Salut encore, je pense que je ' m sur le point de lobtenir, mais une question rapide est quand même là pour réinitialiser le numéro de série. Disponible (); valeur et la ramener à 0?
  • Vous pouvez faire Serial.read() sans utiliser la valeur renvoyée, jusquà ce que Serial.available() renvoie 0.

Réponse

En supposant que lesquisse doit imprimer « Hello World » lorsque le caractère dentrée a 3 bits de haut. Voici quelques variantes de comptage du nombre de bits définis dans un octet.

int bits1(int c) { int res = 0; for (int i = 0; i < 8; i++) { if ((1 << i) & c) res = res + 1; } return (res); } int bits2(int c) { int m = 0x80; int res = 0; do { if (m & c) res++; } while (m >>= 1); return (res); } int bits3(int c) { int m = 0x80; int res = 0; do { res += (m & c) != 0; } while (m >>= 1); return (res); } #define bits4(c) __builtin_popcount(c) #define bits bits4 void setup() { Serial.begin(9600); while (!Serial); } void loop() { if (Serial.available() > 0) { int c = Serial.read(); if (bits(c) == 3) { Serial.print((char) c); Serial.print(":"); Serial.print(c, BIN); Serial.println(": Hello World"); } } } 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *