Сразу оговорюсь - 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 являются лишними.