2013-04-10 62 views
1

我在perl(5.12 ActiveState)中使用线程来允许在Windows上的两个不同COM端口上进行并行和异步写入。这就是我的代码的样子:当Perl线程退出时,串口处理程序错误

#!/usr/bin/perl 

use warnings; 
use strict; 
use Win32::SerialPort; 
use threads; 

my $ComPortObj = new Win32::SerialPort ("COM10") or die ("This is the bitter end..."); 
[... omit port settings ...] 

my $ComPortObj2 = new Win32::SerialPort ("COM6") or die ("This is the bitter end..."); 
[... omit port settings ...]  

my $s_read = ""; 

my $HangupThr = async 
{ 
    # printf("THREAD - Wait 3 seconds\n"); 
    # sleep(3); 
    print("THREAD - write on COM10: AT\n"); 
    $ComPortObj->write("AT\r") || die ("Unable to send command\n"); 
    printf("THREAD - Wait 1 second\n"); 
    sleep(1); 
    $s_read = $ComPortObj2->input; 
    # $s_read =~ s/\n/N/g; 
    # $s_read =~ s/\r/R/g; 
    print("THREAD - read from COM6: $s_read\n"); 
    return 1; 

}; 
$HangupThr->detach(); 

# printf("MAIN - Wait 4 seconds\n"); 
# sleep(4); 
print("MAIN - write on COM6: AT\n"); 
$ComPortObj2->write("AT\r") || die ("Unable to send command\n"); 
printf("MAIN - Wait 1 second\n"); 
sleep(1); 
$s_read = $ComPortObj->input; 
# $s_read =~ s/\n/N/g; 
# $s_read =~ s/\r/R/g; 
print("MAIN - read from COM10: $s_read\n"); 

$ComPortObj->close(); 
$ComPortObj2->close(); 

我得到的是程序退出时的错误。完整的输出:

MAIN - write on COM6: AT 
THREAD - write on COM10: AT 
MAIN - Wait 1 second 
THREAD - Wait 1 second 
MAIN - read from COM10: AT 
OK 

THREAD - read from COM6: AT 
OK 

Error in PurgeComm at C:\userdata\Perl scripts\src\handler_error.pl line 0 thread 1 
The operation completed successfully. 
Error in GetCommTimeouts at C:\userdata\Perl scripts\src\handler_error.pl line 0 thread 1 
Error Closing handle 184 for \\.\COM6 
The handle is invalid. 
Error closing Read Event handle 188 for \\.\COM6 
The handle is invalid. 
Error closing Write Event handle 192 for \\.\COM6 
The handle is invalid. 
Error in PurgeComm at C:\userdata\Perl scripts\src\handler_error.pl line 0 thread 1 
The handle is invalid. 
Error in GetCommTimeouts at C:\userdata\Perl scripts\src\handler_error.pl line 0 thread 1 
Error Closing handle 144 for \\.\COM10 
The handle is invalid. 
Error closing Read Event handle 148 for \\.\COM10 
The handle is invalid. 
Error closing Write Event handle 180 for \\.\COM10 
The handle is invalid. 

这是关系到串口处理程序清除,这是我对线程如何perl的重复不知道。我在线程中尝试了各种密切的尝试,主要...没有成功。此外,我必须在主程序和线程中使用相同的端口。任何建议来防止这些错误?

非常感谢!

回答

0

您正在处理串行端口,并且在任何时候,只有一个进程可以控制串行端口(某些终端交换机提供多次登录,但那不是您的情况)在一个进程连接到COM的窗口中,它会自动断开其他进程。你可以尝试通过尝试登录到相同的COM端口两次从Windows机器和其他端口应该断开连接,这应该导致无效的句柄,你看到的错误。

其他的事情,你可以尝试

  1. 创建COM对象线程,使用它和访问它在其他线程之前销毁对象
+0

我做了一些实验,只有这样,才能避免错误是在启动线程之前关闭主程序中的所有com对象。实际上,错误与线程启动时产生的重复com对象有关。请查看以下@pilcrow的评论以了解更多详情。是的,一旦我没有重复,我不得不正确地打开和关闭线程内的COM对象。 – 2013-04-15 15:21:38