User Tools

Site Tools


in202:seance_5:serial

Obtenir des informations textuelles

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 :

  1. Qui initialise la communication série avec l'ordinateur dans la section setup().
  2. 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.

Correction

Correction

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().

Correction

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 :

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<class T>
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<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);
}

Compiler et exécuter sur la carte ARDUINO.

Correction/Remarque

Correction/Remarque

Penser à afficher la fenêtre moniteur série sous Tools » Serial Monitor.

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.

Correction

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.

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
}

Compiler et exécuter sur la carte ARDUINO.

Correction/Remarque

Correction/Remarque

Penser à afficher la fenêtre moniteur série sous Tools » Serial Monitor.

Navigation

in202/seance_5/serial.txt · Last modified: 2022/11/18 10:46 (external edit)