我想使用Windows XP下的Win32::SerialPort模块从COM端口读取文本字符串。
串口附有刻度,连续发送当前测量的重量。由于我也在使用Win32::GUI,我需要一种方法来读取非阻塞。最好的方法是什么?我应该使用Lookfor
还是streamline
?我对文档感到有些困惑。
原始问题文字:Ichmöchtemitdem Modul Win32 :: SerialPort unter Windows Xp von einem COM-Port ein bestimmten Textstring nur einlesen。一个dem SerialPort ist eine Waage angeschlossen,死于永久性的das aktuell gemessene Gewicht ausgibt。 Da ich auch Win32 :: GUI verwende darf / sollte das einlesen nicht blockierend sein。 Wie stelle ich das am geschicktesten? sollte ich verwenden Lookfor oder精简? Ich blicke bei dem Manual nicht so richtig durch。
答案 0 :(得分:6)
由于设备通过串口不断发送信息,您可能需要设置一个计时器,并在不阻塞主线程的情况下查看连接中的内容。
首先,我将指向Win32::GUI::Tutorial::Part4,讨论定时器。
使用perl.exe
运行以下示例,而不是wperl.exe
,因为输出会转到控制台:
#!/usr/bin/perl
package My::GUI;
use strict; use warnings;
use Win32::GUI();
sub new { bless {} => shift }
sub initialize { # very quick and dirty example
my $self = shift;
$self->{window} = Win32::GUI::Window->new(
-name => 'Main',
-title => 'Test',
-onTerminate => sub { -1 },
-onTimer => sub { $self->onTimer(@_) },
);
$self->{timer} = $self->{window}->AddTimer(Timer => 0);
return $self;
}
sub run {
my $self = shift;
my $window = $self->{window};
$window->Show;
$window->SetRedraw(1);
$self->{timer}->Interval(1000);
Win32::GUI::Dialog();
}
# poll serial port here, don't block
sub onTimer { warn time - $^T, "\n"; return; }
package main;
use strict; use warnings;
My::GUI->new->initialize->run;
输出:
C:\Temp> gui 1 2 3 4 5 6 Terminating on signal SIGINT(2)
现在,关于Win32::SerialPort与Win32::CommPort之间的选择以及哪些方法取决于连接另一端的比例规格。