User Tools

Site Tools


in202:seance_5:serial

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
in202:seance_5:serial [2021/04/28 12:46]
bmonsuez created
in202:seance_5:serial [2022/11/18 10:46] (current)
Line 1: Line 1:
- 
 ====== Obtenir des informations textuelles ====== ====== 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. ​ 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. ​
Line 27: Line 29:
   - Envoie un message "hello world" sur le port série toutes les 5 secondes une fois l'​initialisation effectuée.   - 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.
 +
 +<hidden Correction>​
 +
 +<code cpp>
 +void setup() {
 +  Serial.begin(9600);​
 +}
 +
 +void loop() {
 +  Serial.print("​Hello word"​\n"​);​
 +  delay(5000);​
 +}
 +</​code>​
 +
 +</​hidden>​
  
 ===== Etape 2 : Utiliser l'​opérateur ''<<''​ ===== ===== Etape 2 : Utiliser l'​opérateur ''<<''​ =====
Line 41: Line 59:
 </​code>​ </​code>​
  
-Sachant que ''​Serial''​ est un objet ayant comme type ''​class ​Print {}'',​ en utilisant la surcharge d'​opérateurs,​ ainsi que les template, proposer un moyen de transformer le code précédent en :+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 :
  
 <code cpp> <code cpp>
Line 48: Line 66:
  
 Modifier votre programme précédent pour utiliser cet opérateur en lieu et places des commandes ''​Serial.print()''​. Modifier votre programme précédent pour utiliser cet opérateur en lieu et places des commandes ''​Serial.print()''​.
 +
 +<hidden Correction>​
 +
 +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 :
 +
 +<code cpp>
 +Serial << "​Value:​ " << 3 << "​\n";​
 +</​code>​
 +
 +au lieu d'​avoir à écrire :
 +
 +<code cpp>
 +Serial << "​Value:​ ";
 +Serial << 3;
 +Serial << "​\n";​
 +</​code>​
 +
 +En fait l'​opérateur ''<<''​ est associatif à gauche, donc cela signifie que l'​écriture précédente est équivalent à :
 +
 +<code cpp>
 +((Serial << "​Value:​ ") << 3) << "​\n";​
 +</​code>​
 +
 +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 :
 +
 +<code cpp>
 +Serial << "​Value:​ ";
 +Serial << 3;
 +Serial << "​\n";​
 +</​code>​
 +
 +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 :
 +
 +<code cpp>
 +template<​class T>
 +UARTClass&​ operator << (UARTClass&​ theSerial, const T& theValue)
 +{
 +    theSerial.print(theValue);​
 +    return theSerial;
 +}
 +</​code>​
 +
 +Vous pouvez désormais modifier votre code pour utiliser l'​opérateur ''<<''​ en lieu de la fonction ''​print''​ de ''​Serial''​ : 
 +
 +<code cpp>
 +template<​class T>
 +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);​
 +}
 +</​code>​
 +
 +</​hidden>​
  
 Compiler et exécuter sur la carte ARDUINO. ​ Compiler et exécuter sur la carte ARDUINO. ​
 +
 +<hidden Correction/​Remarque>​
 +
 +Penser à afficher la fenêtre __moniteur série__ sous ''​Tools >> Serial Monitor''​.
 +
 +</​hidden>​
 +
  
 ===== Etape 3 : Modifier le code de l'​exemple ''​blink''​ pour afficher les actions ===== ===== Etape 3 : Modifier le code de l'​exemple ''​blink''​ pour afficher les actions =====
Line 56: Line 148:
  
 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. 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.
 +
 +
 +<hidden Correction>​
 +
 +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.
 +
 +<code cpp>
 +
 +template<​class T>
 +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
 +}
 +</​code>​
 +
 +</​hidden>​
 +
  
 Compiler et exécuter sur la carte ARDUINO. ​ Compiler et exécuter sur la carte ARDUINO. ​
  
-===== Navigation =====+<hidden Correction/​Remarque>​ 
 + 
 +Penser à afficher la fenêtre __moniteur série__ sous ''​Tools >> Serial Monitor''​. 
 + 
 +</​hidden>​ 
 + 
 +====== Navigation ​======
  
 Précédent:​ [[.:​blink|Première compilation]] Précédent:​ [[.:​blink|Première compilation]]
  
 Suivant: [[.:​component_led|Le composant logiciel LED]] Suivant: [[.:​component_led|Le composant logiciel LED]]
in202/seance_5/serial.1619613973.txt.gz · Last modified: 2021/04/28 12:46 by bmonsuez