Différences entre versions de « SerialCommand »
Ligne 25 : | Ligne 25 : | ||
/* String Command In Serial Port using String | /* String Command In Serial Port using String | ||
− | + | Le programme attend qu'une commande arrive sur le moniteur série. | |
− | + | Assurez vous que le moniteur série d'Arduino soit bien configuré sur "Carriage Return" | |
− | + | Entrer 'on' allume la LED connectée sur la pin 13. | |
− | + | Entrer 'off' éteint la LED connectée sur la pin 13. | |
− | + | Cela fournit une alternative à Bitlash. | |
− | + | Le circuit: | |
− | + | La Pin 13 est connectée à une résistance de 220-ohm, qui est alors | |
− | + | connecté à une LED et ensuite à la masse (GND). Comme alternative, | |
+ | vous pouvez regarder la LED "L" visible sur la carte Arduino et | ||
+ | déjà raccordée sur la broche 13. | ||
− | + | Créé le July 21, 2010, par Mark Aosawa. mark.aosawa@yahoo.com | |
− | + | Modifié en profondeur April 7, 2012 par MC Hobby, info@mchobby.be | |
− | |||
− | |||
− | |||
− | |||
− | |||
*/ | */ | ||
− | //String buffer | + | //String buffer/mémoire tampon |
String cmd = String(""); | String cmd = String(""); | ||
− | // | + | // Initialiser la LED de la pin 13 comme sortie (OUTPUT) |
− | |||
− | |||
int ledPin = 13; | int ledPin = 13; | ||
void setup() { | void setup() { | ||
− | // | + | // Initialise la communication série (et baud rate à 9600): |
Serial.begin(9600); | Serial.begin(9600); | ||
pinMode(ledPin, OUTPUT); | pinMode(ledPin, OUTPUT); | ||
− | // | + | // Affiche un message quand le port série est ouvert. |
− | // | + | // Permet de vérifier que le programme est bien en court de fonctionnement |
Serial.println("Serial communication is ready."); | Serial.println("Serial communication is ready."); | ||
} | } | ||
Ligne 65 : | Ligne 60 : | ||
void loop() { | void loop() { | ||
− | // | + | // Vérifier si des caractères sont reçu sur le port série |
if (Serial.available() > 0) { | if (Serial.available() > 0) { | ||
− | // | + | // Variable temporaire pour copier le caractère lu |
char SerialInByte; | char SerialInByte; | ||
− | // | + | // Lire un caractère (un Byte) |
SerialInByte = Serial.read(); | SerialInByte = Serial.read(); | ||
+ | // Si c'est <CR> --> traiter la commande | ||
if(SerialInByte==13){ | if(SerialInByte==13){ | ||
ProcessCmd(); | ProcessCmd(); | ||
}else{ | }else{ | ||
− | // | + | // sinon, ajouter le caractère à la mémoire tampon (cmd) |
cmd += String(SerialInByte); | cmd += String(SerialInByte); | ||
+ | |||
+ | // et afficher un message de déboggage | ||
Serial.print( "SerialInByte: " ); | Serial.print( "SerialInByte: " ); | ||
Serial.print( SerialInByte, DEC ); | Serial.print( SerialInByte, DEC ); | ||
Ligne 86 : | Ligne 84 : | ||
} | } | ||
− | // | + | // Renvoyer la commande (contenu du buffer) sur le port série |
void printCmd(){ | void printCmd(){ | ||
Serial.println(cmd); | Serial.println(cmd); | ||
} | } | ||
− | // | + | // Réinitialiser le buffer (et vider le port série) |
void clearCmd(){ | void clearCmd(){ | ||
cmd=""; | cmd=""; | ||
Ligne 97 : | Ligne 95 : | ||
} | } | ||
− | // | + | // Interpréter la commande reçue |
+ | // | ||
void ProcessCmd() { | void ProcessCmd() { | ||
+ | // Un petit message de débogage. La commande est entourée avec [] pour clairement | ||
+ | // identifier chacun des caractères qui la compose (même les espaces). | ||
Serial.print( "ProcessCmd for [" ); | Serial.print( "ProcessCmd for [" ); | ||
Serial.print( cmd ); | Serial.print( cmd ); | ||
Ligne 112 : | Ligne 113 : | ||
clearCmd(); | clearCmd(); | ||
}else{ | }else{ | ||
− | // | + | // toutes les autres commandes sont ignorées. |
Serial.println("unknown command!"); | Serial.println("unknown command!"); | ||
clearCmd(); | clearCmd(); |
Version du 7 avril 2012 à 21:26
Description
SerialCommand est un projet simple visant à mettre en place un interpréteur de commande rudimentaire sur le port série.
Le but est d'attendre que l'utilisateur entre un mot clé ("on" ou "off") sur le Moniteur Série d'Arduino et d'allumer la LED de la Pin 13 (visible sur la carte) en fonction de l'ordre reçu.
Cet exemple vraiment rudimentaire sera par la suite utilisé comme fondation dans autre exemple du GPRS shield (réception d'une commande par SMS ;-) ).
Principe de fonctionnement
Une ligne de commande est composé d'un ensemble de caractères reçus via la liaison série.
Chaque caractère est empilé dans un buffer (mémoire tampon) de commande en attendant le caractère de fin de commande (celui qui exécutera la commande).
La fin de commande attendu est le caractère Carriage Return (aussi noté <CR>) correspondant à la touche de Entrée/Return/Enter sur un clavier. C'est la touche de retour chariot.
La valeur numérique de <CR> est 13.
Le retour chariot étant utilisé comme caractère de fin de commande vérifiez que le moniteur série d'Arduino IDE soit bien configuré sur Carriage return
Une fois le caractère de fin de commande détecté, la commande est envoyée à la fonction "ProcessCmd" en charge de la détection de la commande et de son exécution.
Code de démonstration
le code de démonstration ci-dessous envois également de nombreux messages de débogage sur le port série. Cela permet de se rendre compte assez facilement du fonctionnement interne du programme.
/* String Command In Serial Port using String Le programme attend qu'une commande arrive sur le moniteur série. Assurez vous que le moniteur série d'Arduino soit bien configuré sur "Carriage Return" Entrer 'on' allume la LED connectée sur la pin 13. Entrer 'off' éteint la LED connectée sur la pin 13. Cela fournit une alternative à Bitlash. Le circuit: La Pin 13 est connectée à une résistance de 220-ohm, qui est alors connecté à une LED et ensuite à la masse (GND). Comme alternative, vous pouvez regarder la LED "L" visible sur la carte Arduino et déjà raccordée sur la broche 13. Créé le July 21, 2010, par Mark Aosawa. mark.aosawa@yahoo.com Modifié en profondeur April 7, 2012 par MC Hobby, info@mchobby.be */ //String buffer/mémoire tampon String cmd = String(""); // Initialiser la LED de la pin 13 comme sortie (OUTPUT) int ledPin = 13; void setup() { // Initialise la communication série (et baud rate à 9600): Serial.begin(9600); pinMode(ledPin, OUTPUT); // Affiche un message quand le port série est ouvert. // Permet de vérifier que le programme est bien en court de fonctionnement Serial.println("Serial communication is ready."); } void loop() { // Vérifier si des caractères sont reçu sur le port série if (Serial.available() > 0) { // Variable temporaire pour copier le caractère lu char SerialInByte; // Lire un caractère (un Byte) SerialInByte = Serial.read(); // Si c'est <CR> --> traiter la commande if(SerialInByte==13){ ProcessCmd(); }else{ // sinon, ajouter le caractère à la mémoire tampon (cmd) cmd += String(SerialInByte); // et afficher un message de déboggage Serial.print( "SerialInByte: " ); Serial.print( SerialInByte, DEC ); Serial.print( ", Buffer " ); Serial.println( cmd ); } } } // Renvoyer la commande (contenu du buffer) sur le port série void printCmd(){ Serial.println(cmd); } // Réinitialiser le buffer (et vider le port série) void clearCmd(){ cmd=""; Serial.flush(); } // Interpréter la commande reçue // void ProcessCmd() { // Un petit message de débogage. La commande est entourée avec [] pour clairement // identifier chacun des caractères qui la compose (même les espaces). Serial.print( "ProcessCmd for [" ); Serial.print( cmd ); Serial.println( "]" ); if(cmd.equals("on")){ printCmd(); digitalWrite(ledPin, HIGH); clearCmd(); }else if(cmd.equals("off")){ printCmd(); digitalWrite(ledPin, LOW); clearCmd(); }else{ // toutes les autres commandes sont ignorées. Serial.println("unknown command!"); clearCmd(); } }
Résultat
La LED 13 s'allume et s'éteint lorsque la commande "on" ou "off" est reçue.
Outre cette modification de la Pin 13, les messages suivants sont également visible sur le moniteur série.
La séquence de commandes (chacune terminée par la touche Entrée) utilisé dans cet exemple est:
- on
- off
- test
Serial communication is ready. SerialInByte: 111, Buffer o SerialInByte: 110, Buffer on ProcessCmd for [on] on SerialInByte: 111, Buffer o SerialInByte: 102, Buffer of SerialInByte: 102, Buffer off ProcessCmd for [off] off SerialInByte: 116, Buffer t SerialInByte: 101, Buffer te SerialInByte: 115, Buffer tes SerialInByte: 116, Buffer test ProcessCmd for [test] unknown command!