Сразу оговорюсь - Perl - один из моих самых любимых языков программирования. Текстовый протокол работы PowerAnt как раз и разрабатывался для удобства программирования на Perl. Каждая команда и каждый отчет PowerAnt о ее выполнении содержат в основном уникальные символы и с легкостью разбираются.
Если для пользователей Linux вопрос "где взять Perl" обычно заранее предрешен, то пользователям Windows можно порекомендовать ActivePerl.
Perl в стандартной поставке не знает что такое RS-232 порт, поэтому необходимо доустановить еще пакет Win32::SerialPort (Для ActivePerl потребуются: Win32-API.ppd, Win32-SerialPort.ppd).
#!/usr/bin/perl -w
use Win32::SerialPort;
$PowerAnts = new Win32::SerialPort('COM2','','') || die "Can't open COM2";
$PowerAnts->baudrate(9600) || die "Can't set 9600";
$PowerAnts->parity('none') || die "Can't set parity none";
$PowerAnts->databits(8) || die "Can't set 8 data bits";
$PowerAnts->stopbits(1) || die "Can't set one stopbit";
$PowerAnts->handshake('none') || die "Can't HW flow control off";
$PowerAnts->write_settings;
#...........
#........... $PowerAnts->close() || die "Что-то не так при закрытии файла устройства\n";; undef $PowerAnts;
В данном участке кода приведена процедура которая использует функции write для передачи команды в RS-232 порт и функцию read для чтения результатов выполнения команд побайтно. В данном случае использовать операцию input не получится, так как в ней находится цикл ожидания символа \n (0x0A), который в протоколе PowerAnt не используется.
sub pwrant_cmd($){
my $cmd = shift;
$PowerAnts->write($cmd."\r");
$_ = '';
do {
$_ .= $PowerAnts->read(1);
} while (! /\r/);
return $_;
};
$_ = pwrant_cmd("!??");
Если отчет о выполнении команды отрицателен, то в строке-ответе содержится символ '-'. Для того чтобы его обнаружить, на Perl необходимо написать:
die "Программа выполнила недопустимую операцию и будет закрыта" if (/-/);
Например, для PowerAnt типа SwSe обнаружение выключения датчика 'K' может производиться следующим образом:
$_ = pwrant_cmd('?=');
while( ! /K/ ){
die "Программа выполнила недопустимую операцию и будет закрыта" if (/-/);
$_ = pwrant_cmd('?%');
};
# Датчик K сработал
Например, сделаем бегущий огонек (применимо для PowerAnt типов SwSe и SwSw), для чего напишем простую программу:
#!/usr/bin/perl -w
use Win32::SerialPort;
$PowerAnts = new Win32::SerialPort('COM2','','') || die "Can't open COM2";
$PowerAnts->baudrate(9600) || die "Can't set 9600";
$PowerAnts->parity('none') || die "Can't set parity none";
$PowerAnts->databits(8) || die "Can't set 8 data bits";
$PowerAnts->stopbits(1) || die "Can't set one stopbit";
$PowerAnts->handshake('none') || die "Can't HW flow control off";
$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"); # выключить все выключатели
while( 1 ){
$_ = pwrant_cmd("=".$x_off); # Выключить выключатель
# Анализируем ответ
die "Программа выполнила недопустимую операцию и будет закрыта" if (/-/);
$x_on++;
$x_off++;
if( $x_on gt 'H' ){
$x_on = 'A';
$x_off = 'a';
};
$_ = pwrant_cmd("=".$x_on); # Включить выключатель
# Анализируем ответ
die "Программа выполнила недопустимую операцию и будет закрыта" if (/-/);
sleep( 1 ); # Задержка 1 секунда
};
$PowerAnts->close() || die "Что-то не так при закрытии файла устройства\n";;
undef $PowerAnts;
Если Вы знаете Perl, и у Вас есть руководство программиста PowerAnt, то дальнейшие объяснения как писать программы для PowerAnt являются лишними.