我在perl(5.12 ActiveState)中使用线程允许在Windows上的两个不同COM端口上进行并行和异步写入。这就是我的代码的样子:
#!/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 :(得分:0)
您正在处理串行端口,并且在任何时候只有一个进程可以控制串行端口(某些终端交换机提供多个登录但不是您的情况)在Windows中,当一个进程连接到COM时,它会自动断开其他进程。您可以通过尝试从Windows计算机两次登录到同一个COM端口来尝试此操作,而另一个端口应该断开连接,这会导致您看到错误的无效句柄。
您可以尝试的其他事项