|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/22383315ff583.html, оценка из 5, голосов 10
|