2014-10-08 44 views
0

我想从另一个perl脚本调用perl脚本,从串口读取并写入文件。我已经提取了我的代码来隔离问题,因此代码的重点可能没有意义。由perl调用的Windows进程没有正确写入文件

来电:

use Win32::Process; 

my $perl_path = $^X; 
my $SerialLogProcess; 
my $SerialLogObj; 
my $serial_log_script = "callee.pl"; 
Win32::Process::Create($SerialLogObj, "$perl_path", "perl $serial_log_script " ,0,NORMAL_PRIORITY_CLASS,"."); 
$SerialLogProcess = $SerialLogObj->GetProcessID(); 

print "waiting for 3 secs"; 
sleep(3); 
print "done"; 
`taskkill /F /T /PID $SerialLogProcess`; 

被叫:

use Win32::SerialPort; 

my $portObj = new Win32::SerialPort("\\\\.\\COM70") || die; 
my $serialReading; 
$portObj->baudrate(115200); 
$portObj->parity("none"); 
$portObj->databits(8); 
$portObj->stopbits(1); 
system("rm -r \"log.txt\""); 
open (LOGFILE, ">>log.txt") or die; 

while (1){ 
    $serialReading = $portObj->read(10); 
    print LOGFILE $serialReading; 
    #print LOGFILE " "; 
} 

所以调用者创建被调用者脚本的过程,然后在3秒后杀死它。在这3秒钟内,我做了一些保证串口读取的消息。日志文件被创建,但没有写入它。

继承人有什么奇怪的:我可以使消息显示出两种方式。我直接从命令行运行被调用脚本,或者我可以取消最后一次打印的注释。不幸的是,这些对我来说不是解决方案。我非常难过,为什么我不能让我的代码正常工作,这让我觉得有一些未定义的行为。

回答

2

输出默认被缓冲。数据写入后最终会写入数据。或者您可以使用以下内容,每次打印都会导致冲洗。

use IO::Handle qw(); # Needed before Perl 5.14 

open (LOGFILE, ">>log.txt") or die; 
LOGFILE->autoflush(1); 

但是,为什么使用全局变量?

open (my $LOGFILE, ">>log.txt") or die; 
$LOGFILE->autoflush(1); 
print $LOGFILE $serialReading;