Perl, работа с последовательным портом.

И всё прочее, что касается HTML
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Charlz_Klug_
проходил мимо

Perl, работа с последовательным портом.

Непрочитанное сообщение Charlz_Klug_ » 2011-03-15 8:42:05

Код: Выделить всё

#!/usr/bin/env perl
use Device::SerialPort;
$PortName = '/dev/ttyS0';
$quiet = '';
         $PortObj = new Device::SerialPort ($PortName, $quiet)
              || die "Can't open $PortName: $!\n";
         # similar
         $PortObj->baudrate(9600);
         $PortObj->parity("none");
         $PortObj->databits(8);
         $PortObj->stopbits(1);        # POSIX does not support 1.5 stopbits
   $PortObj->handshake("xoff");
#$output_string = "CC02300000000000000000000000000000FE00EE";
#$output_string = "0000000000000000000000000000FE00EE";
$count_out = $PortObj->write(0xCC, 0x02, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0xEE);
#  warn "write failed\n"         unless ($count_out);
#  warn "write incomplete\n"     if ( $count_out != length($output_string) );

($count_in, $string_in) = $PortObj->read(100);
  warn "read unsuccessful\n" unless ($count_in == $InBytes);
print $string_in;
Насколько я понимаю, должен открыться последовательный порт, в него должны быть отправлены байты "0xCC, 0x02, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0xEE" и получен ответ, но ничего не приходит. Где я ошибаюсь?

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Charlz_Klug_
проходил мимо

Re: Perl, работа с последовательным портом.

Непрочитанное сообщение Charlz_Klug_ » 2011-03-16 12:26:04

Код: Выделить всё

#!/usr/bin/env perl
#порт: COM1
#скорость: 9600
#бит: 8
#паритет: нет
#стоп бит: 1
use Win32::SerialPort qw( :STAT 0.19 );
  $PortObj = new Win32::SerialPort ('COM1')
       || die "Can't open $PortName: $^E\n";    # $quiet is optional
  $PortObj->baudrate(9600);
  $PortObj->parity("none");
  $PortObj->databits(8);
  $PortObj->stopbits(1);
    $PortObj->write_settings || undef $PortObj;
$PortObj->read_interval(100);

$output_string = pack('H40','CC02300000000000000000000000000000FE00EE');
  $count_out = $PortObj->write($output_string);
  warn "write failed\n"         unless ($count_out);
  warn "write incomplete\n"     if ( $count_out != length($output_string) );
my ($count, $result) = $PortObj->read(100);
$result = unpack('H100',$result);
print "count = $count, result = $result\n";
Вот такой пример работает. Отправляет устройству подключённому к последовательному порту COM1 байты "CC02300000000000000000000000000000FE00EE" и получает от него ответ:

Код: Выделить всё

D:\Projects\Tancy920CMS>perl Tancy920CMS.pl
count = 36, result = cc02301c0020100325101849000000000000145156f9055000000765530
0695dbe2f06ee

D:\Projects\Tancy920CMS>