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的重复不知道。我在线程中尝试了各种密切的尝试,主要...没有成功。此外,我必须在主程序和线程中使用相同的端口。任何建议来防止这些错误?
非常感谢!
我做了一些实验,只有这样,才能避免错误是在启动线程之前关闭主程序中的所有com对象。实际上,错误与线程启动时产生的重复com对象有关。请查看以下@pilcrow的评论以了解更多详情。是的,一旦我没有重复,我不得不正确地打开和关闭线程内的COM对象。 – 2013-04-15 15:21:38