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

发布于 2024-08-09 04:15:43 字数 793 浏览 4 评论 0原文

我想在Windows XP下使用 Win32::SerialPort 模块来读取来自 COM 端口的文本字符串。

串行端口连接有一个秤,可持续发送当前测量的重量。由于我也在使用 Win32::GUI 我需要一种方法来阅读它非阻塞。最好的方法是什么?我应该使用 Lookfor 还是 streamline?我对文档有点困惑。


原始问题文本:我使用 Modul Win32::SerialPort unter Windows Xp von einem COM-Port ein bestimmten Textstring nur einlesen。 SerialPort ist eine Waage angeschlossen, die permanent das aktuell gemessene Gewicht ausgibt.这是 Win32::GUI 版本/sollte das einlesen nicht blockierend sein。这是什么? sollte ich verwenden Lookfor oder 流线型吗? Ich blicke bei dem Manual nicht so richtig durch。

I would like to use the Win32::SerialPort module under Windows XP to read a text string from a COM port.

There is a scale attached to the serial port which continuously sends the current measured weight. Since I'm also using Win32::GUI I need a way to read that non-blocking. What's the best way to do this? Should I use Lookfor or streamline? I'm a little confused by the documentation.


Original question text: Ich möchte mit dem Modul Win32::SerialPort unter Windows Xp von einem COM-Port ein bestimmten Textstring nur einlesen. An dem SerialPort ist eine Waage angeschlossen, die permanent das aktuell gemessene Gewicht ausgibt. Da ich auch Win32::GUI verwende darf/sollte das einlesen nicht blockierend sein. Wie stelle ich das am geschicktesten an? Was sollte ich verwenden Lookfor oder streamline? Ich blicke bei dem Manual nicht so richtig durch.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

百思不得你姐 2024-08-16 04:15:43

由于设备不断通过串行端口发送信息,因此您可能需要设置一个计时器并在不阻塞主线程的情况下查看连接中发生了什么。

首先,我将向您指出 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 以及哪种方法取决于连接另一端的电子秤规格。

Since the device is continuously sending information through the serial port, you probably want to set up a timer and take a look at what's coming down the connection without blocking the main thread.

First, I am going to point you to Win32::GUI::Tutorial::Part4 where timers are discussed.

Run the following example using perl.exe, not wperl.exe because the output goes to the console:

#!/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;

Output:

C:\Temp> gui
1
2
3
4
5
6
Terminating on signal SIGINT(2)

Now, regarding the choice between Win32::SerialPort versus Win32::CommPort and which methods depends on the specs of the scale on the other end of the connection.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文