[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: serial port



On 19-Jul-2004, Mon, 10:42:34, Alexander Pytlev <apytlev@tut.by> wrote:

> ltb> есть  необходимось  постоянноо слушать com порт и писать все в файл, но
> ltb> программы   типа   minicom  плохо,  что  посоветуете ? Как это сделать
> ltb> максимально просто ?
> У меня этим скриптом читаются данные из миниАТС:
> (взято из pblogan-0.0.1a.tar.gz)
> 
> #!/usr/bin/perl -w
> #
> # This perl script is based on a program written by Paul Haas, the original program
> # can be found at http://hamjudo.com/rcx/talkrcx.txt
> #
> #
> 
> $port = "/dev/ttyS0";
> open("portfh","+<$port") || die "opening $port for input: $!";
> 
> system("stty 9600 -echo parmrk cs8 -cstopb raw < $port");
> while(1) {
>     getmsg("portfh" );
>     sleep( 1 );
> }
> close("portfh");
> 
> 
> sub getmsg {
>     local $portfh = @_;
>     local($inbuff,$rin) = ('','');
> 
>     vec($rin,fileno("portfh"),1) = 1;
>     while ( select($rin, undef, undef, 0.3) ) {
>         $char = '';
>         sysread ("portfh",$char,1);
>         $inbuff .= $char;
>     }
>     if( length( $inbuff ) > 0 ){
>         open( LOG, ">>/var/log/pbx.log" );
>         print LOG "$inbuff" ;
>         close( LOG );
>     }
>     return;
> }

Тогда уж лучше использовать Device::SerialPort, так как болучается немного
более гибко, а то system("stty 9600 -echo parmrk cs8 -cstopb raw < $port");
это конечно здорово, но ...

use     Device::SerialPort;

my      $Port   = '/dev/ttyS0';
my      $Lock   = '/var/lock/LCK..ttyS0';

my $port = Device::SerialPort->new( $Port, 0, $Lock )
	or die "error open serial port $Port - $!";
#       Init port
        $port->baudrate( 9600 )         or warn "port->baudrate\n";
	$port->databits( 8 )            or warn "port->databits\n";
	$port->parity( "none" )         or warn "port->parity\n";
        $port->stopbits( 1 )            or warn "port->stopbits\n";
	$port->handshake( "none" )      or warn "port->handshake\n";
#       $port->debug( 1 )               or warn "port->debug\n";
        $port->purge_all;
	$port->read_char_time( 1200 );
	$port->write_settings;

Ну а дальше можно через $port->read(...) читать, в принципе можно сделать
tie для STDIN и работать должно, но я не пробывал.

Ну и выводить можно не в файл а в syslog, а уже на уровне syslog
перенаправить это дело в любой файл да и по сети проще пересылать - ни каких
переделок программы не будет.

>  Alexander
-- 
With Best,                      | http://www.excom.spb.su/~andrey
     Andrey Chernomyrdin        | mailto:andrey@excom.spb.su 



Reply to: