Transfert de données du moniteur série vers la carte Arduino avec Serial.read

Le moniteur série permet aussi de transmettre des données vers la carte Arduino qui peut les lire, puis les convertir en nombre, commande…

Comme pour le transfert de la carte vers l’ordinateur, les informations sont des entiers d’un octet. Quand ils sont définis dans le moniteur série, il s’agit de caractères codés en ASCII suivis d’un retour à la ligne.

 

Les données sont gérées comme un flux avec un buffer (fonctionnement proche d’une file). Les données (des octets) arrivant sur la carte sont placées, une à une dans le buffer, puis défilées lors des instructions de lecture. Il est possible de savoir si le buffer est vide, combien de données il comprend, de défiler les données jusqu’à un certain caractère, de lire un entier ou un flottant…

 

Exemple : le code suivant lit les caractères reçus, 1 à 1, et les retourne au moniteur série.

int data;

void setup() {

  Serial.begin(9600);

}

void loop() {

  if (Serial.available()>0) {

    data = Serial.read();

    Serial.print("Reçu :"); Serial.println(data);

  }

}

 

Serial.available() retourne le nombre d’octets

Serial.read() défile et retourne une donnée du buffer, -1 s’il n’y a pas plus de données.

 

Dans le moniteur série, après avoir transmis le message « ABC », l’affichage est le suivant :

Le caractère 'A' a pour code ascii 65. La fonction Serial.println(data) retourne donc les caractères ‘6’ et ‘5’ suivi d’un retour à la ligne.

On remarque que le code du dernier caractère est 10, correspondant au retour à la ligne défini lorsque l’on utilise la touche « entrée » du clavier.

 

L’affichage est plus cohérent

-          en convertissant la donnée en caractère Serial.println((char)data) ;

-          ou en utilisant Serial.write(data) ; Serial.write(10) ;

Remarque : des tutoriels proposent d’utiliser une fonction SerialEvent. La documentation Arduino déconseille son utilisation, car la fonction n’est plus utilisable sur les cartes récentes.