gyn

Win32下的Perl,无用的select,停滞的Tk,结束吧....

perl串口通信实例

使用串口通信,在备机端使用如下脚本检测来自主机的心跳信号,一旦未接受次数超过指定记数,备机认为主机DOWN机,自动设置为主机的网络参数,顶替主机提供服务。

# ! perl -w

use  strict;
use  Win32 :: SerialPort;

my   $port   =   ' COM2 ' #  serail port name registried in OS
my   $count   =   0 #  count number of heartbeat-receiving failture
my   $max_count   =   5 #  max fail count to be tolerated 
my   $interface   =   '

# ---------------------------------- 
# 接口 IP 配置         
# ---------------------------------- 
pushd interface ip


# "local" 的接口 IP  配置

set address name="local" source=static addr=192.168.6.185 mask=255.255.255.0
set address name="local" gateway=192.168.6.65 gwmetric=0
set dns name="local" source=static addr=192.168.6.112 register=PRIMARY
add dns name="local" addr=192.168.6.201 index=2
set wins name="local" source=static addr=none


popd
# 接口 IP 配置结束


' #  net inetrface config information

sub  errlog {
    
# log the failtrue occuring time
    
    
open  ERR ,   ' >>err.log ' ;
    
my   @time   =   localtime ();
    
my   $time   =   sprintf ( " %d " ,   $time [ 5 +   1900
                        
.   ' - '  
                        
.   sprintf ( " %d " ,   $time [ 4 +   1 )
                        
.   ' - '
                        
.   " $time[3] "
                        
.   '   '
                        
.   sprintf ( " %.2d " ,   $time [ 2 ])
                        
.   ' : '
                        
.   sprintf ( " %.2d " ,   $time [ 1 ])
                        
.   ' : '
                        
.   sprintf ( " %.2d " ,   $time [ 0 ]);
    
print  ERR  $time . " \n " ;
    
close  ERR;
}

sub  ipchange {
    
#  change ip addrress
    
    
open  TMP ,   ' >tmp ' ;
    
print  TMP  $interface ;
    
close  TMP;
    
    
eval  {
        
system   ' netsh -f tmp ' ;
        
unlink   ' tmp ' ;
    };
    
    
if  ($@) { return   0 ;}
    
return   1 ;
}

my   $ob   =  Win32 :: SerialPort -> new( $port ) or  die   " CANNOT OPEN $port " ;
#  open serial port 

eval  {
    
#  set serial port properties
    
    
$ob -> baudrate( 9600 );
    
$ob -> parity( ' none ' );
    
$ob -> databits( 8 );
    
$ob -> stopbits( 1 );
    
$ob -> handshake( ' none ' );
};
    
if  ($@) { die   ' SET FAILED ' ;}

$ob -> write_settings or  die   " CANNOT WRITE $port DRIVER " ;
#  write to port driver to make it active

while  ( 1 ) {
    
#  loop receiving heartbeat from remote machine
    # change ip address after designated count of failture 

    
    
my  ( $length ,   $result =   $ob -> read ( 10 );
    
    
if  ( $result ) { 
        
$count   =   0 ;
    } 
elsif  ( $count   ==   $max_count ) {
        errlog();
        
if  (not ipchange()) {  print   ' IP CHANGE FAILED ' ; }
        
last ;
    }    
else  { 
        
$count ++ ;
    }
    
    
sleep ( 1 );
}

undef   $ob ;

posted on 2007-11-27 14:40 gyn_tadao 阅读(2106) 评论(0)  编辑 收藏 引用 所属分类: perl

只有注册用户登录后才能发表评论。
<2007年11月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

导航

统计

常用链接

留言簿(15)

随笔分类(126)

随笔档案(108)

相册

搜索

最新评论

阅读排行榜

评论排行榜