Perl est mon langage de programmation favori. Le protocole textuel du PowerAnt a été avant tout conçu pour le programmer en Perl. Chaque commande et chaque réponse du module ne contient que des caractères uniques ce qui rend l'analyse très facile.
Si pour les utilisateur de Linux, la question "Ou puis-je trouver Perl?" n'est plus d'actualité, les utilisateurs de Windows pourrons trouver ActivePerl.
En Natif, Perl ne gère pas le port RS232. Pour lui ajouter le support du port RS232, vous devez installer des modules spécifiques Win32::SerialPort (Pour ActivePerl il nécessite : Win32-API.ppd, Win32-SerialPort.ppd).
#!/usr/bin/perl -w
Utiliser Win32::SerialPort;
$PowerAnts = new Win32::SerialPort('COM2','','') || die "Impossible d'ouvrir le COM2";
$PowerAnts->baudrate(9600) || die "Impossible de configurer en 9600";
$PowerAnts->parity('none') || die "Impossible de configurer la parité none";
$PowerAnts->databits(8) || die "Impossible de configurer 8 bits de données";
$PowerAnts->stopbits(1) || die "Impossible de configurer 1 bit de stop";
$PowerAnts->handshake('none') || die "Impossible de configurer le control de flux matériel inactif";
$PowerAnts->write_settings;
#...........
#........... $PowerAnts->close() || die "Fermeture du port impossible, quelquechose ne va pas!\n";; undef $PowerAnts;
Dans ce morceau de code source est présenté la procédure utilisant la fonction "write" (écrire) pour emmettre des octets vers les modules et la fonction "read" (lire) pour obtenir les octets émis par les modules. La procédure standard "input" (entrée) n'est pas de grande utilité (elle attend juste de recevoir le code 0x0A).
sub pwrant_cmd($){
my $cmd = shift;
$PowerAnts->write($cmd."\r");
$_ = '';
do {
$_ .= $PowerAnts->read(1);
} while (! /\r/);
return $_;
};
$_ = pwrant_cmd("!??");
Si la réponse du module contient le caractère '-', c'est qu'il répond à la négative. Cela signifie donc qu'un problème est surveni. Pour la detection de erreur en Perl vous pouvez utiliser un ligne de text tel:
die "Il y'a un problème\n" if (/-/);
Par exemple, pour le PowerAnt modèle SwSe le changement d'état du capteur 'K' (de 'k' à 'K') devrait être detecté par le programme suivant:
$_ = pwrant_cmd('?=');
while( ! /K/ ){
die "Un problème est survenu\n" if (/-/);
$_ = pwrant_cmd('?%');
};
# Capteur 'K' est actif
Par exemple, faire le programme de chenillard (Le programme peu être utiliser avec le PowerAnt modèles : SwSe et SwSw):
#!/usr/bin/perl -w
use Win32::SerialPort;
$PowerAnts = new Win32::SerialPort('COM2','','') || die "Impossible d'ouvrir le COM2";
$PowerAnts->baudrate(9600) || die "Impossible de configurer en 9600";
$PowerAnts->parity('none') || die "Impossible de configurer la parité none";
$PowerAnts->databits(8) || die "Impossible de configurer 8 bits de données";
$PowerAnts->stopbits(1) || die "Impossible de configurer 1 bit de stop";
$PowerAnts->handshake('none') || die "Impossible de configurer le control de flux matériel inactif";
$PowerAnts->write_settings;
sub pwrant_cmd($){
my $cmd = shift;
$PowerAnts->write($cmd."\r");
$_ = '';
do {
$_ .= $PowerAnts->read(1);
} while (! /\r/);
return $_;
};
$x_on = 'H';
$x_off = 'h';
pwrant_cmd("=abcdefgh"); # Eteindre toutes les sorties
while( 1 ){
$_ = pwrant_cmd("=".$x_off); # Eteindre la sortie donnée par la variable $x_off
# Test de la réponse
die "Un problème est survenu\n" if (/-/);
$x_on++;
$x_off++;
if( $x_on gt 'H' ){
$x_on = 'A';
$x_off = 'a';
};
$_ = pwrant_cmd("=".$x_on); # Active la sortie donnée par la variable $x_on
# Test de la réponse
die "Un problème est survenu\n" if (/-/);
sleep( 1 ); # Attendre 1 seconde
};
$PowerAnts->close() || die "Un problème est survenu\n";;
undef $PowerAnts;
Si Perl est votre langage de programmation favori, et que vous avez le manuel du programmeur du PowerAnt, alors je pense que toute discussion concernant "l'écriture de programmes pour PowerAnt en Perl ?" n'a pas de sens.