📡 Communication série (Serial)

Maîtrisez le protocole UART, le moniteur série et l'échange de données bidirectionnel entre Arduino et PC

Qu'est-ce que la communication série ?

La communication série est le moyen le plus simple et le plus courant de faire communiquer un Arduino avec le monde extérieur — un PC, un module Bluetooth, un écran, un GPS ou un autre microcontrôleur. Les données sont envoyées bit par bit sur un seul fil, à une vitesse définie appelée baud rate.

L'Arduino Uno utilise le protocole UART (Universal Asynchronous Receiver/Transmitter) via le module USART matériel de l'ATmega328P. La communication passe par deux broches :

Sur l'Arduino Uno, ces broches sont également connectées au convertisseur USB-série (ATmega16U2 ou CH340), ce qui permet de communiquer directement avec le PC via le câble USB et le moniteur série de l'IDE.

⚙️ Serial.begin() — Initialiser la communication

Toute communication série commence par l'initialisation dans setup() :

Serial.begin(9600);  // Initialise la série à 9600 bauds

Le paramètre est le baud rate (vitesse en bits par seconde). Les valeurs les plus courantes :

Baud rateUsage typique
9600Par défaut pour le débogage, suffisant pour la plupart des cas
115200Rapide, utilisé pour les transferts de données plus importants
4800Modules GPS (standard NMEA)
38400Modules Bluetooth HC-05/HC-06

⚠️ Règle d'or : Le baud rate doit être identique des deux côtés de la communication (Arduino ET moniteur série / module externe). Une différence produit des caractères illisibles (« charabia »).

📤 Envoyer des données (Arduino → PC)

Les fonctions d'envoi sont les plus utilisées pour le débogage et l'affichage de données :

Serial.print("Bonjour");      // Envoie du texte (sans retour à la ligne)
Serial.println("Monde");       // Envoie du texte + retour à la ligne (\r\n)
Serial.print(42);              // Envoie un entier en décimal : "42"
Serial.print(42, BIN);         // En binaire : "101010"
Serial.print(42, HEX);         // En hexadécimal : "2A"
Serial.print(3.14159, 2);      // Float avec 2 décimales : "3.14"
Serial.write(65);              // Envoie l'octet brut (65 = 'A' en ASCII)

Différence entre print() et write()

📥 Recevoir des données (PC → Arduino)

Pour recevoir des données depuis le moniteur série ou un module externe :

void loop() {
    if (Serial.available() > 0) {       // Des données sont disponibles ?
        char c = Serial.read();          // Lire un octet
        Serial.print("Reçu : ");
        Serial.println(c);
    }
}

Fonctions de réception

FonctionDescription
Serial.available()Retourne le nombre d'octets en attente dans le buffer de réception (64 octets max)
Serial.read()Lit et retire un octet du buffer (retourne -1 si vide)
Serial.peek()Lit un octet sans le retirer du buffer
Serial.readString()Lit tout le buffer sous forme de String (attend un timeout)
Serial.readStringUntil('\n')Lit jusqu'au caractère spécifié
Serial.parseInt()Lit et parse un nombre entier depuis le buffer

💻 Exemple complet : Contrôle LED par commandes série

Ce programme permet d'allumer et d'éteindre une LED en envoyant des commandes texte depuis le moniteur série :

const int LED = 13;

void setup() {
    Serial.begin(9600);
    pinMode(LED, OUTPUT);
    Serial.println("=== Contrôle LED ===");
    Serial.println("Commandes : ON, OFF, BLINK");
}

void loop() {
    if (Serial.available() > 0) {
        String cmd = Serial.readStringUntil('\n');
        cmd.trim();  // Supprimer espaces et \r

        if (cmd == "ON") {
            digitalWrite(LED, HIGH);
            Serial.println("LED allumée !");
        }
        else if (cmd == "OFF") {
            digitalWrite(LED, LOW);
            Serial.println("LED éteinte.");
        }
        else if (cmd == "BLINK") {
            Serial.println("Clignotement 5x...");
            for (int i = 0; i < 5; i++) {
                digitalWrite(LED, HIGH); delay(200);
                digitalWrite(LED, LOW);  delay(200);
            }
            Serial.println("Terminé.");
        }
        else {
            Serial.print("Commande inconnue : ");
            Serial.println(cmd);
        }
    }
}

Dans le moniteur série, configurez le retour à la ligne sur « Nouvelle ligne » (NL) et tapez ON, OFF ou BLINK pour contrôler la LED.

📊 Le traceur série (Serial Plotter)

L'IDE Arduino 2.x intègre un traceur série (Outils → Traceur série ou Ctrl+Shift+L) qui affiche les valeurs numériques sous forme de courbe en temps réel. C'est un outil fantastique pour visualiser les données d'un capteur.

Pour l'utiliser, envoyez simplement des valeurs numériques séparées par des tabulations ou des espaces :

void loop() {
    int capteur1 = analogRead(A0);
    int capteur2 = analogRead(A1);

    Serial.print(capteur1);
    Serial.print("\t");     // Tabulation = séparateur entre courbes
    Serial.println(capteur2);
    delay(50);
}

Le traceur affichera deux courbes superposées, une pour chaque capteur. C'est idéal pour le calibrage de capteurs, le suivi de température ou le débogage d'algorithmes de filtrage.

🔌 Communication avec des modules externes

La communication série n'est pas limitée au PC. Vous pouvez utiliser les mêmes fonctions pour communiquer avec des modules externes connectés aux broches TX/RX :

💡 SoftwareSerial : L'Arduino Uno n'a qu'un seul port série matériel (D0/D1). Si vous devez communiquer avec un module ET le PC en même temps, utilisez la bibliothèque SoftwareSerial pour créer un second port série sur d'autres broches numériques :
SoftwareSerial bt(10, 11); // RX=10, TX=11

📌 Le protocole UART en détail

Comprendre le fonctionnement bas niveau de l'UART est utile, surtout si vous faites aussi de la programmation PIC ou ATmega. Chaque octet est transmis sous la forme d'une trame composée de :

La configuration par défaut d'Arduino est 8N1 : 8 bits de données, pas de parité (None), 1 bit de stop. À 9600 bauds, chaque bit dure environ 104 µs, et la transmission d'un octet complet (10 bits avec start et stop) prend environ 1.04 ms.

Si vous voulez approfondir l'implémentation UART au niveau registre, consultez notre tutoriel UART du PIC16F877A qui configure le module USART directement via les registres TXSTA, RCSTA et SPBRG.