如何在Perl Win32 :: GUI程序中连续读取串口?

时间:2009-10-20 15:18:05

标签: perl user-interface winapi serial-port

我想使用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。

1 个答案:

答案 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::SerialPortWin32::CommPort之间的选择以及哪些方法取决于连接另一端的比例规格​​。