Salut à toutes et tous
Je vois passer tellement de questions concernant la gestion d'un port série ou la lecture du keypad (ou d'une réponse à une requête GET HTTP) que je me dis qu'un petit tuto sur ce sujet ne peut pas faire de mal
Ce tuto n'a pas vocation à expliquer en détail le port série et les bases de la communication. Ceci est très bien fait dans les tutos d'eskimon: Communication par la voie série
Ce tuto n'a pas vocation à détailler l'implémentation d'un protocole de communication, il y a déjà un bon tuto de barbudor sur ce sujet en français
Enfin - ce tuto n'a pas vocation à remplacer le tuto de Robin en anglais Serial Input Basics auquel je fais souvent référence et qui est très complet. Vous retrouverez des principes généraux du tuto de Robin, mais en français et en se concentrant sur deux ou trois trucs pratiques.
Quelques bases: String ou c-string
Comme le dit la doc Arduino, il existe deux façons de représenter des chaînes de caractères. La classe String (avec un grand S) et le tableau de caractère terminé par un caractère nul '\0', que l'on appelle c-string car venant du langage C.
Ce tutorial n'utilisera pas la classe String. Cette classe n'est pas l'amie du programmeur sur petits micro-contrôleurs quand on ne comprend pas bien les notions d'allocation de mémoire dynamique.
Bien que les nouveaux Arduino à base ARM et similaires aient plus de RAM, on reste très loin des Giga-Octets de RAM dispos sur un ordinateur et il n'y a pas d'OS pour faire le ménage dans la mémoire (garbage collector) si d'aventure une allocation dynamique venait à ne pas trouver un bloc contigu de mémoire disponible.
Je vous laisse chercher sur internet la notion de pile et tas (éventuellement en commençant par ce post en français qui a été copié sur ce post plus détaillé en anglais du site Adafruit)
Vous pouvez aussi lire cet article en anglais The Evils of Arduino Strings qui explique très bien pourquoi cette classe vous jouera sans doute des tours.
Alors oui, pour les jeunes qui n'ont connu que les langages modernes ou interprétés sur gros ordinateurs, on retournera un peu à l'âge de pierre, plus près du matériel et des octets, et on n'utilisera pas des fonctions avancées de la classe String qui - au coût d'une utilisation mémoire intensive et un risque de bugs difficiles à trouver - vont vous simplifier un peu la vie..
à titre d'exemple qui je l'espère vous convaincra - ce code qui affiche Bonjour tout le monde dans la console
String message = "Bonjour tout le monde";
void setup() {
Serial.begin(115200);
Serial.print(message);
}
void loop() {}
occupera sur un UNO 2848 octets de mémoire soit 8% de l'espace de stockage de programmes et 222 octets (10%) de mémoire dynamique tout simplement parce que j'ai choisi la classe String pour stocker mon message.
Comparez cela à ce programme qui fait la même chose
char message[] = "Bonjour tout le monde";
void setup() {
Serial.begin(115200);
Serial.print(message);
}
void loop() {}
Ce croquis utilise 1482 octets soit 4% de l'espace de stockage de programmes et 206 octets (10%) de mémoire dynamique.
Donc sans parler des soucis de tas et de pile, on voit donc pleinement l'impact de la classe String sur la mémoire programme (quasiment 1400 octets de plus!) et donc si on peut s'en passer c'est mieux surtout si vous avez besoin de place pour votre code perso.
Mais comment alors effectuer des opérations un peu avancées sur les c-string de façon à ne pas à avoir à complètement réinventer la roue? il y a pour cela nombre de fonctions provenant du langage C qui savent travailler sur les c-string. Vous les trouverez dans les librairies standards stdlib.h et string.h par exemple.
C'est ce que j'utiliserai dans ce tutorial.