LOCODUINO

Bibliothèque Serial

.
Par : Dominique, Guillaume, Jean-Luc

DIFFICULTÉ :

Explications

Bibliothèque officielle faisant partie de l’IDE Arduino, elle facilite l’écriture du code pour communiquer avec un autre Arduino ou un ordinateur.
Nous allons donc voir les différentes commandes de cette bibliothèque. Nous n’allons pas ici mettre en pratique ces commandes, ce sera le sujet d’autres articles.

Installation

Cette bibliothèque fait donc partie intégrante de l’outil de développement ’Arduino, elle est installée de base. Il suffit juste de l’importer dans le programme que l’on écrit.

Rappel

La voie série est une des possibilités de dialogue entre un Arduino et un autre périphérique, que ce soit un autre Arduino, un micro-contrôleur ou un ordinateur.
Attention, des précautions sont à prendre comme :

  • utiliser le même niveau de voltage pour la communication entre deux périphériques
  • bien brancher les fils entre deux Arduino ou avec un autre périphérique
  • que ce soit entre deux Arduino (avec la voie série 1) ou avec un PC, l’utilisation de la voie série rend les broches digitales 0 et 1 (respectivement Tx et Rx) inopérants. Elles ne peuvent plus être utilisées comme entrées ou sorties digitales.

Il existe aussi selon les Arduino une ou plusieurs voies séries. Cela sera visible dans chaque article carte Arduino.

Importer la bibliothèque

Cela se fait automatiquement dès lors qu’une commande utilisant Serial est introduite dans le code.

Les différents codes et fonctions

Le code fonctionne majoritairement en deux parties : la première désigne la voie série car selon les Arduino, il peut en exister plusieurs, et un point sépare la première de la seconde partie qui est la fonction appelée : Serial.begin(9600);

Les commandes suivantes s’appliqueront donc à la voie série qui s’utilise ou alors avec un ordinateur et le terminal ou un autre Arduino avec les broches 0 et 1.

Ouvrir la voie série

Ce code initialise la voie série et définit la vitesse de transmission des données. Cette vitesse doit être la même sur chaque périphérique notamment entre l’Arduino et la console de l’IDE Arduino, afin en quelque sorte que chaque périphérique parle la même langue.

Serial.begin(taux);

Ce code est à placer dans le setup. La vitesse peut être de 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, ou 115200.

Présence de données sur la voie série

Savoir si il y a des données présentes sur la voie série permet d’optimiser le code. En effet, la lecture des données sera effectuée qu’il y ait ou non des données. Si il n’y a pas de données, on perd un temps qui peut être précieux selon le type de programme qu’utilise l’Arduino.
Il y a donc une fonction qui permet de savoir si des données sont ou non présentes.

Serial.available()

’available()’ renvoie le nombre de bytes qu’il y a à lire sur la voie série. Plus précisément, chaque donnée qui arrive de la voie série est stockée dans le tampon qui peut contenir 64 octets.
Il suffira simplement simplement de coupler cette fonction à un test et une comparaison stricte par rapport à 0 pour entraîner ou non des actions selon la présence de données.

.print() et .println() ou comment afficher sur le terminal de l’IDE Arduino
Ces fonctions permettent de faire parler l’Arduino sur votre ordinateur.
Dans l’exemple suivant, on déclare une constante VERSION de type texte, qui sera mise à jour à chaque évolution du programme. Pour se souvenir de cette version, il est pratique d’afficher celle-ci sur le terminal de l’IDE au démarrage (Setup) du programme :

#define VERSION "Version 1.0 du 26/01/2016 de Mon_Truc"

void setup() {
  Serial.begin(115200);
  delay(10);
  Serial.println(VERSION); 
}

void loop() {
  // reste du programme
}

.write()
Tout comme les fonctions précédentes, elle permet d’écrire sur la voie série en envoyant des données ou des chaînes de caractères sur le même principe : si valeur d’une variable à transmettre, nous mettons le nom de la variable entre les parenthèses. Dans le cas d’une chaîne de caractères (string), nous mettons la chaîne entre guillemets dans les parenthèses.
La différence que nous retrouvons avec les précédentes fonction est que celle-ci renvoie le nombre d’octets qu’elle a transmis sur la voie série, c’est-à-dire la longueur de la chaîne.

int a = Serial.write("la longueur de la chaîne est 31");
et a sera égal à 31, le zéro de fin de chaîne n’est pas compté.

.flush()
Cette fonction permet au programme d’attendre que la totalité des données à envoyer sur la voie série sont bien parties.
Elle n’est pas souvent utilisée, mais comme l’envoi des données série se fait en tâche de fond, il y a une mémoire tampon qui pourrait se saturer si le programme transmet trop de données à la fois. Plutôt que d’utiliser l’instruction delay() qui provoquerait des pertes de temps inutiles, il vaut mieux utiliser flush().

Serial.flush();
Elle n’a pas besoin de paramètres.

Fonctions peu usitées

Serial.end()
Comme la fonction le dit, elle permet de fermer une voie série afin de permettre l’utilisation des broches comme entrées ou sorties digitales.
Serial.end();
Cette fonction n’a pas besoin de paramètres

(Serial)
Cette variable retourne True si la voie série est disponible. Elle est surtout utilisée dans le cadre de l’utilisation d’un Arduino Leonardo pour savoir si la voie série est disponible après ouverture afin que le programme continue son exécution correctement.

void setup() {
  Serial.begin(9600);
  while (!Serial) {
//reste dans cette boucle tant que la voie série est non disponible
  }
}

void loop() {
  Suite du programme
} 

Bien souvent il est nécessaire d’utiliser d’autres broches que les broches 0 et 1 et aussi, parfois, plusieurs liaisons série sont nécessaires, par exemple pour conserver la fonction de communication avec le terminal de l’IDE aux fins de mise au point.

Dans ce cas nous nous reporterons à l’article Bibliothèque SoftWare Serial.

15 Messages

  • desactiver la sortie Serial (vers le moniteur) 14 février 2020 16:13, par Francois

    Bonjour
    Votre site est très interessant et m’aide régulièrement !
    Je souhaite en féliciter les créateurs
    Aujourd’hui je souhaite soulever un problème, celui de desactiver de manière pratique la sortie serial.

    En effet je bricole en ce moment sur des sketches un peu lourds, avec tant de complexité que je passe des journées entières à trouver des nouvelles solutions et debugger. Ca me conduit à un gros travail de placement des Serial.print aux endroit opportuns.
    ces remontées d’info serial vers l’ordi sont vraiment précieuses, je ne souhaite pas les enlever car lorsque le robot ne marchera pas bien pour x raison c’est evidemment vers elles que je vais me tourner.

    Evidemment il faut les désactiver pour un usage normal car cela donne enormément de travail à l’arduino, et du temps. et risques de bug et d’erreurs aussi sans doute.

    Jusqu’ici, je plaçais partout des conditions if, avant chaque communication Serial.print , avec la condition sur une pin en PULLUP qu’il suffisait de déconnecter de la masse pour réactiver la sortie vers le moniteur donc.

    Franchement ces conditions font enormément de pollution visuelle dans le sketch. Je me suis demandé si je ne pouvais pas utiliser Serial.end pour carrément couper ce travail là sans utiliser les if.

    donc j’ai Serial.begin(9600) ; en SETUP et au tout debut de void loop() comme cela : if (digitalRead(A7)==0)Serial.end() ;

    eh bien ça ne marche pas du tout ! cela me fait meme un bug general car visiblement ça bloque totalement l’arduino...

    bizarre on dirait que personne ne parle de ce sujet nulle part...
    ....personne n’a ce besoin de desactiver son serial monitor...
    ....personne n’est gêné par le temps perdu des transmissions serial...

    Alors, comment les désactiver proprement sans toutes ces conditions if ? est ce que qq a la réponse ?

    Merci par avance !

    Répondre

    • desactiver la sortie Serial (vers le moniteur) 14 février 2020 17:34, par Jean-Luc

      Bonjour,

      La remarque msport ci-dessous est pertinente et vous ne pouvez donc pas utiliser Serial.end() pour vous débarrasser des impressions.

      Ce que vous pouvez faire c’est définir des fonctions, une par type de donnée que vous afficher :

      void doLog(const char data)
      {
          if (digitalRead(logPin) == LOW) {
              Serial.print(data);
          }
      }
      
      void doLog(const uint32_t data)
      {
          if (digitalRead(logPin) == LOW) {
              Serial.print(data);
          }
      }

      etc pour les autres types de données que vous utilisez sans oublier la variante ln si vous en avez besoin.

      Mais ça ne supprimera pas le code le jour où c’est au point.

      vous pouvez donc définir également une macro :

      #ifdef DEBUG
      #define LOG(data) doLog(data)
      #else
      #define LOG(data)
      #endif

      Que vous pourrez rendre opérante par un :

      #define DEBUG

      Répondre

  • Bibliothèque Serial 14 février 2020 17:12, par msport

    Bonjour,
    je n’ai pas la réponse quant au comment faire (à priori, ce n’est pas la bonne solution).
    Mais l’explication pourquoi ça bloque :
    There is no check if serial is enabled. So all you print() statements will execute. And they will fill the data register and the buffer which is not a problem. UNTIL the buffer is full ! Once the Serial buffer is full the write will wait until there is room in the buffer aka blocking the program. And because the buffer is not emptied the program will hold there...

    Voir en ligne : Serial buffer is full

    Répondre

  • disable Serial 14 février 2020 18:41, par Francois

    Merci msport pour les explications !

    Merci a Jean-Luc pour ta réponse !
    Je viens d’essayer, ça marcherait presque !
    faudrait peut etre trouver une autre type de variable pour stocker les phrases ?

    j’ai fait ça :

    void setup() {
        Serial.begin(9600);
    }
    
    
    void doLog(const char data)
    {
        Serial.println(data);
    }
    
    void loop() {
        Serial.print("x"); delay(400);
        doLog("essai");
        doLog('a');
    }

    ça me donne ça :

    x
    a
    x
    a
    x

    donc le "a" passe, mais "essai" non !

    une idee ?

    Répondre

    • disable Serial 14 février 2020 21:23, par Jean-Luc

      Oui,

      Il faut également un doLog pour les chaines :

      void doLog(const char data[])
      {
          Serial.println(data);
      }

      Et un pour les entiers

      Répondre

  • Bibliothèque Serial 15 février 2020 16:16, par francois

    le coup des crochets, Merci beaucoup !

    Je viens quand même de galerer, j’avais mis un PULLUP sur pin A7 et une condition sur A7, rien ne sortait ! J’ai switché sur la pin digitale 7 et là ça marche !!!

    Merci a vous infiniment, je vais bosser à partir de là !!

    J’ai une cloture electrique a vache devant la maison, j’ai constaté qu’avec juste 20Cm de fil connecté à un driver de moteur pas à pas, il me fait un pas à chaque coup de jus de la clotûre. Je soupçonne la cloture de m’avoir grillé les pins Analogiques de cet arduino, juste en lui mettant 20cm de fil à la patte !

    D’ailleurs je me demande ce qu’on devrait faire des pin non utilisées (non connectées) des arduinos. Il me semble que des connections qu’on ait pu faire dessus peuvent faire buguer un arduino. or elles se reçoivent de l’induction electromagnetique, il n’est pas dit que ces 1 ou 0 non desirés n’aillent pas influer dans les processus en cours dans l’arduino ?? ça me trotte depuis un moment cette idée, et pareil, personne n’en parle...

    Pourtant des bugs avec l’arduino, venant d’on ne sait où, on ne peut pas dire qu’on n’en a pas... mettre des condos 104 ceramique sur toutes les pins ???

    Répondre

  • Bibliothèque Serial 15 février 2020 16:53, par francois

    Ah la vache, vs avez raison !! d’habitude je ne les utilise pas celles là. Avec la A5 ça marche ! Oui, nano, je n’utilise plus que des nano !

    Quel âne ! Je suis depuis une semaine sur ce soft, tous les jours du matin jusqu’à 3h dans la nuit, je dois être usé.

    Merci vraiment, les gars

    Répondre

  • Bibliothèque Serial 15 février 2020 17:54, par msport

    En parlant de crochets, on pense aux accolades qui disparaissent ...
    Quel code pour insérer du code dans les messages du site éditorial ?
    Il n’est pas permis d’insérer des images ni d’utiliser les attributs html class

    Répondre

  • Bibliothèque Serial 15 février 2020 19:59, par Jean-Luc

    Ça ressemble au html. Il faut utiliser la balise <code>. On ferme comme en html en mettant un / devant. On peut ajouter comme attribut <code class="arduino"> pour avoir la coloration syntaxique et ajouter <code class="arduino sans_telechargement"> pour supprimer le bouton.

    Répondre

  • Bibliothèque Serial et module Bluetooth BK8000L 26 mars 2020 16:00, par Nicolas

    Bonjour à tous, et d’abord merci pour ce site très intéressant !

    Rien à voir avec le ferroviaire, mais j’espère que vous voudrez bien m’aider ;-)

    J’essaye de communiquer en série avec un module bluetooth. J’ai la liste des commandes AT qu’il est supposé comprendre, mais il semble ne pas les comprendre. Une question me hante : les information qui s’affichent sur le moniteur série de l’IDE arduino sont elles également envoyées sur les sorties 0 et 1 de la carte ?
    Au voltmètre, je vois bien quelque chose passer (baisse de tension) sur l’entée du module à chaque trame AT.

    Merci pour votre aide !
    Amicalement,
    Nicolas

    Répondre

  • Bibliothèque Serial 26 mars 2020 20:40, par msport

    Question 1 : Yes.
    Pas de fantôme sur TX/RX, vérifiez que les paramètres du port serial sont ceux du module bluetooth : la vitesse en particulier.
    Voir la doc et la démo :
    https://www.mikrocontroller.net/att...
    On trouvera peut être une application pour les annonces dans les gares ...

    Voir en ligne : Demo

    Répondre

  • Bibliothèque Serial 27 mars 2020 18:13, par Nicolas

    Merci beaucoup msport pour la réponse.
    J’ai déjà lus les liens que tu m’as indiqué, je pense être dans le bon... Mais peut-être est-ce mon module qui est HS ou paramétré différemment...puisqu’il a l’air d’être I2C... je m’y pencherai plus tard.
    En attendant je commande les fonctions du module par les sorties de l’arduino. C’est plus long, ça utilise plus de sorties et de code...
    Tant pis, pour l’instant il m’en reste encore de disponible.

    Encore merci et peut être à bientôt sur les rails !
    Bon confinement,
    Nicolas

    Répondre

  • Bibliothèque Serial 27 mars 2020 22:43, par msport

    * Note that the baud rate, 9600, N, 8,1 ; dixit la doc.

    on lit (mal) dans la doc p2 (schéma bloc) que RX/TX seraient 11 et 10 et sur le schéma p3 "serial port" 13 et 14.
    Probablement référence 1) au connecteur et 2) au socket.

    A tester avec un émulateur de terminal comme hyper terminal ou YAT ou autre et un convertisseur genre FTDI. (RX -> TX et TX -> RX)

    ça ressemble à l’ESP32 auquel on s’intéresse actuellement.

    Répondre

  • Bibliothèque Serial 14 août 2021 17:39, par martin

    Bonjour, merci pour le detail de la bibliothèque Serial. Cependant pour un exercice on me demande de ne pas utiliser la bibliotheque Serial mais des fonctions de plus bas niveau. Sauriez vous ou je peux trouver les codes sources de Serial. Comment faisait on avant l’utilisation de la bibliotheque ? merci.

    Répondre

Réagissez à « Bibliothèque Serial »

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.

Lien hypertexte

(Si votre message se réfère à un article publié sur le Web, ou à une page fournissant plus d’informations, vous pouvez indiquer ci-après le titre de la page et son adresse.)

Rubrique « Bibliothèques »

Les derniers articles

Les articles les plus lus