====== Obtenir des informations textuelles ====== [[in202:seance_5|Retour à la séance 5]] Pour corriger vos erreurs de programmation en C++, vous lirez attentivement les messages d'erreur renvoyés à la console par le compilateur. Mais ce n'est pas parce qu'un code compile enfin, qu'il réalise bien ce que vous en attendez. Pour mettre au point vos programmes, il sera donc aussi nécessaire d'observer précisément, depuis l'ordinateur, ce qui se passe à bord de la carte et de son microcontrôleur. Pour cela, on utilisera une liaison série (assez lente) de la carte à l'ordinateur, obtenue par émulation sur la liaison USB (assez rapide) et passant par l'UART du microcontrôleur. Logiciellement, on l'initialisera comme suit, à un débit normalisé de 9600 bits/s : Serial.begin(9600) Ensuite, pour envoyer des valeurs à afficher (entier, flottant, ou simple chaîne de caractères), on se servira, pour chacune, d'une des deux instructions suivantes, selon que l'on souhaitera ou pas un retour à la ligne : Serial.println(val) Serial.print(val) Pour recevoir ces informations côté ordinateur, il faudra ouvrir le moniteur série, soit en cliquant sur le bouton dédié en haut à droite, soit via les menus (soit enfin via le raccourci clavier disponible) : ''Outils > Moniteur série'' ===== Etape 1 : Créer un nouveau programme ''hello world''===== Créer un programme : - Qui initialise la communication série avec l'ordinateur dans la section ''setup()''. - Envoie un message "hello world" sur le port série toutes les 5 secondes une fois l'initialisation effectuée. Nous initialisons la communication dans la fonction ''setup()'' et nous envoyons le message dans la fonction ''loop()'' puis nous attendons 5 s. void setup() { Serial.begin(9600); } void loop() { Serial.print("Hello word"\n"); delay(5000); } ===== Etape 2 : Utiliser l'opérateur ''<<'' ===== Par défaut, pour pouvoir envoyer les informations sur la console, par exemple afficher le contenu de la variable, il faut appeler de manière successive : int value = 3; Serial.print("value: "); Serial.print(value); Serial.print("\n"); Sachant que ''Serial'' est un objet ayant comme type ''class UARTClass{}'', en utilisant la surcharge d'opérateurs, ainsi que les template, proposer un moyen de transformer le code précédent en : Serial << "value: " << value << "\n"; Modifier votre programme précédent pour utiliser cet opérateur en lieu et places des commandes ''Serial.print()''. Nous devons **surchargé** l'opérateur ''<<''. Cet opérateur est un opérateur binaire, il prend comme premier argument l'élément à gauche de l'opérateur. C'est à dire l'objet ''Serial'' qui a comme type ''UARTClass'' et à droite, il prend l'élément à transmettre qui est une valeur d'un type quelconque. La question est le type résultat de l'opération. Comme nous souhaitons écrire : Serial << "Value: " << 3 << "\n"; au lieu d'avoir à écrire : Serial << "Value: "; Serial << 3; Serial << "\n"; En fait l'opérateur ''<<'' est associatif à gauche, donc cela signifie que l'écriture précédente est équivalent à : ((Serial << "Value: ") << 3) << "\n"; en mettant les parenthèses. Donc le résultat ''Result'' de l'opération ''Serial << "Value: "'' doit être un objet qui puisse accepter l'éciture suivant ''Result<< 3''. On a vu précédent que si on mettait cela sur plusieurs lignes, cela donnait : Serial << "Value: "; Serial << 3; Serial << "\n"; Donc nous identifions que le résultat de l'opération ''Result'' = ''Serial << "Value: "'' doit-être ''Serial''. Ce qui nous donne donc la définition de l'opérateur suivant : template UARTClass& operator << (UARTClass& theSerial, const T& theValue) { theSerial.print(theValue); return theSerial; } Vous pouvez désormais modifier votre code pour utiliser l'opérateur ''<<'' en lieu de la fonction ''print'' de ''Serial'' : template UARTClass& operator << (UARTClass& theSerial, const T& theValue) { theSerial.print(theValue); return theSerial; } void setup() { Serial.begin(9600); } void loop() { Serial << "Hello word" << "\n"; delay(5000); } Compiler et exécuter sur la carte ARDUINO. Penser à afficher la fenêtre __moniteur série__ sous ''Tools >> Serial Monitor''. ===== Etape 3 : Modifier le code de l'exemple ''blink'' pour afficher les actions ===== Rechargez le programme exemple ''blink''. Modifier le programe en ajoutant tout ce qui est nécessaire pour envoyer un message sur la console, chaque fois que vous allumez la diode et chaque fois que vous éteignez la diode. Il ne faut pas oublier d'initialiser le port de communication dans la fonction ''setup()'' et nous ajoutons la génération de message chaque fois que nous allumons et nous éteignons la diode. template UARTClass& operator << (UARTClass& theSerial, const T& theValue) { theSerial.print(theValue); return theSerial; } // the setup function runs once when you press reset or power the board void setup() { // initialize digital pin LED_BUILTIN as an output. pinMode(LED_BUILTIN, OUTPUT); Serial.begin(9600); } // the loop function runs over and over again forever void loop() { digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) Serial << "Builtin led swiched on" << "\n"; delay(1000); // wait for a second digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW Serial << "Builtin led swiched off" << "\n"; delay(1000); // wait for a second } Compiler et exécuter sur la carte ARDUINO. Penser à afficher la fenêtre __moniteur série__ sous ''Tools >> Serial Monitor''. ====== Navigation ====== Précédent: [[.:blink|Première compilation]] Suivant: [[.:component_led|Le composant logiciel LED]]