Главная страница


ru.unix.bsd

 
 - RU.UNIX.BSD ------------------------------------------------------------------
 From : Valentin Nechayev                    2:5020/400     22 Jan 2005  23:18:50
 To : Golyashov Sergey
 Subject : Re: FreeBSD и RS232
 -------------------------------------------------------------------------------- 
 
 >>> Golyashov Sergey wrote: 
 
 VN>> А может начать с использования готовых средств? Hапример, nut.
 GS> Я бы не против, но понятия не имею где готовые средства раздобыть...
 GS> А "nut" это кто?
 
 /usr/ports/sysutils/nut
 Для ippon у него есть драйвер.
 
 VN>> И назови модель бесперебойника и класс интерфейса (dumb или smart),
 VN>> от этого многое зависит.
 GS> IPPON Back Power Pro 500
 GS> Класс интерфейса неизвестен. Мануал к нему на шести страницах. Там
 GS> подробно рассказывается как что куда подключать, как жать единственную
 GS> кнопку и как он пищит если ему что-то не нравится. :) Про класс
 GS> интерфейса ни слова.
 GS> Я еще с сайта производителя скачал спецификацию на протокол, но и там
 GS> про интерфейс не говорится.
 
 Hу на это ответ очень прост: когда на линиях порта выставляются сигналы -
 dumb, если бегают байтики - smart. ;)))
 Бывают смеси - у Victron - smart, но есть и dumb линии.
 
 GS> По поводу советов большой пасиб :) Читаю, вникаю.
 GS> Полагаю использование POSIX::Termios будет тем, что надо, но понять как
 GS> с ним работать пока не получилось. Если у вас найдется пример буду
 GS> очень признателен :)
 GS> Там случаем не надо два Termios объекта создавать? Один на чтение, а
 GS> другой на запись в порт.
 
 Hе-а.
 Ладно, вот что у меня работает для Victron'а:
 ==={{{
 #!/usr/bin/perl
 
 $devname = 'cuaaf';
 $lockfile = "/var/spool/lock/LCK..$devname"; ## BSD location
 
 use POSIX;
 use Fcntl qw(:DEFAULT :flock);
 
 $verbose = 0;
 if( defined $ARGV[0] && $ARGV[0] eq '-v' ) { shift; $verbose = 1; }
 $qst = $ARGV[0]; die unless $qst;
 die unless $qst =~ /^[A-Za-z0-9]+$/;
 
 ## Lock
 ## XXX lock algorithm is possibly bad, todo: rewrite to correct one
 
 if( -f $lockfile ) {
   die "Lockfile seen, anybody else works with device\n";
 }
 open( LOCK, ">$lockfile" ) or die;
 print LOCK $$, "\n";
 close( LOCK );
 
 sysopen( UPS, "/dev/$devname", O_RDWR|O_NONBLOCK, 0 ) or die;
 print STDERR "_: device opened\n" if $verbose;
 $fd = fileno(UPS);
 die unless $fd >= 0;
 print STDERR "_: lockfile ignored\n" if $verbose;
 ## Add CLOCAL
 $termios = POSIX::Termios->new;
 die unless $termios;
 die unless $termios->getattr($fd);
 ## Set raw mode, add CLOCAL
 $termios->setcflag( $termios->getcflag() & ( ~( &POSIX::CSIZE | &POSIX::PARENB )
 ) );
 $termios->setcflag( $termios->getcflag() | &POSIX::CLOCAL | &POSIX::CS8 |
 &POSIX::CREAD );
 $termios->setlflag( $termios->getlflag() & ( ~(
 &POSIX::ECHO|&POSIX::ECHOE|&POSIX::ECHOK|&POSIX::ECHONL|&POSIX::ICANON|&POSIX::I
 SIG|&POSIX::IEXTEN|&POSIX::NOFLSH|&POSIX::TOSTOP) ) );
 $termios->setoflag( $termios->getoflag() & ( ~&POSIX::OPOST ) );
 $termios->setiflag( $termios->getiflag() & (
 ~(&POSIX::IXOFF|&POSIX::INPCK|&POSIX::BRKINT|&POSIX::PARMRK|&POSIX::ISTRIP|&POSI
 X::INLCR|&POSIX::IGNCR|&POSIX::ICRNL|&POSIX::IXON|&POSIX::IGNPAR) ) );
 $termios->setiflag( $termios->getiflag() | &POSIX::IGNBRK );
 $termios->setispeed( &POSIX::B1200 );
 $termios->setospeed( &POSIX::B1200 );
 $termios->setcc( &POSIX::VMIN, 1 );
 $termios->setcc( &POSIX::VTIME, 0 );
 die unless $termios->setattr( $fd, &POSIX::TCSANOW );
 ## 5 seconds to full dialog
 $SIG{'ALRM'} = \&on_alarm;
 alarm(5);
 $f = fcntl( UPS, F_GETFL, 0 );
 fcntl( UPS, F_SETFL, (~O_NONBLOCK) & $f );
 print STDERR "_: CLOCAL set, O_NONBLOCK unset\n" if $verbose;
 ## Send query
 $q = $qst . "?\r";
 $rc = syswrite( UPS, $q, length($q) );
 die $! unless defined $rc;
 print STDERR "_: query is sent\n" if $verbose;
 die if $rc != length($q);
 $r = readline(*UPS);
 alarm(0);
 die unless $r =~ /\n$/;
 $r = $`; $r =~ s/\r$//;
 die unless $r =~ /^\Q$qst\E/;
 $r = $';
 print "$r\n";
 close( UPS );
 unlink( $lockfile );
 exit(0);
 
 sub on_alarm {
   unlink( $lockfile ); exit( 1 );
 }
 ===}}}}
 
 Куча флагов - это втупую взятый из libc комплект cfmakeraw().
 Ещё имеет смысл сделать stty -f /dev/cuaiaf -crtscts;
 stty -f /dev/cualaf crtscts - перловый POSIX почему-то это не знает.
 -netch-
 --- ifmail v.2.15dev5.3
  * Origin: Dark side of coredump (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 FreeBSD и RS232   Golyashov Sergey   22 Jan 2005 07:58:54 
 Re: FreeBSD и RS232   Valentin Nechayev   22 Jan 2005 11:55:03 
 Re: FreeBSD и RS232   Golyashov Sergey   22 Jan 2005 22:46:00 
 Re: FreeBSD и RS232   Valentin Nechayev   22 Jan 2005 23:18:50 
 Re: FreeBSD и RS232   Golyashov Sergey   01 Feb 2005 19:03:23 
 Re: FreeBSD и RS232   Valentin Nechayev   01 Feb 2005 20:30:55 
 Re: FreeBSD и RS232   Valentin Davydov   22 Jan 2005 14:31:00 
 Re: FreeBSD и RS232   Golyashov Sergey   22 Jan 2005 23:09:47 
 Re: FreeBSD и RS232   Valentin Nechayev   22 Jan 2005 23:21:50 
 Re: FreeBSD и RS232   Golyashov Sergey   01 Feb 2005 18:59:48 
 Re: FreeBSD и RS232   Valentin Nechayev   02 Feb 2005 14:22:31 
 Re: FreeBSD и RS232   Valentin Davydov   24 Jan 2005 20:21:46 
 Re: FreeBSD и RS232   Valentin Nechayev   25 Jan 2005 13:36:47 
 FreeBSD и RS232   Andrey Ostanovsky   26 Jan 2005 01:30:46 
 Re: FreeBSD и RS232   Valentin Nechayev   29 Jan 2005 16:47:45 
 FreeBSD и RS232   Anatoly Mashanov   23 Jan 2005 11:50:50 
Архивное /ru.unix.bsd/22383315ff583.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional