perl串口通信实例 (转载)

perl串口通信实例

转载自  http://www.cnblogs.com/starspace/archive/2009/02/20/1394595.html

 

使用串口通信,在备机端使用如下脚本检测来自主机的心跳信号,一旦未接受次数超过指定记数,备机认为主机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 ;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值