gpt4 book ai didi

linux - Perl 设备::串口

转载 作者:太空宇宙 更新时间:2023-11-04 04:58:24 25 4
gpt4 key购买 nike

正在寻找正确的方法来在主板启动消息期间检测一个关键字。检测到关键字后,一秒后发送 Enter 键。内核是Linux。

# Serial port inisialisation is finished here.

# Read boot message
($count, $result) = $ob->read(300); # at least 300 chars coming till keyword appear

if ($result =~ m/Booting_up/) {
print "send Enter ...\n";
sleep 1;
$ob->write("\r\n");
}

谢谢指点

最佳答案

您似乎正在使用 Win32::SerialPort模块,或者Device::SerialPort其中

provides an object-based user interface essentially identical to the one provided by the Win32::SerialPort module.

它的方法read获取要读取的字节数并返回读取的数字并将它们写入给定的字符串。

您可能“遗漏”该短语,因为它已经超过了 300 分,并且您的代码无法再继续阅读。尝试循环,一次获取几个字节并将它们相加,从而以较小的读取次数构建字符串。

my bytes_in = 10;    # length of pattern, but it does NOT ensure anything
my ($read, $result);

while (1)
{
my ($count, $read) = $ob->read( $bytes_in );

$result = $result . $read;
if ($result =~ m/Booting_up/) { # is it "Booting_up" or "Booting up" ?
print "send Enter ...\n";
sleep 1; # is this needed?
$ob->write("\r\n");
# last; # in case this is all you need to do
}

last if $count != $bytes_in; # done reading
}

我没有将 $ob->read 语句放入循环条件中,因为文档对该方法的工作原理并不十分清楚。您也可以简单地使用

while ( my ($count, $read) = $ob->read( $bytes_in ) ) {
$result = $result . $read;
if ($result =~ m/Booting_up/s) {
# ...
}
last if $count != $bytes_in;
}

我们一次读取少量字节,以防止轮询阻塞读取出现问题,这些问题在 BenPen 的评论中提出。 。请参阅Configuration and capability methods .

您可以先一次性读取该模式之前的前 300 个字节,然后开始一次读取几个(或一个)字节,这也可以最快地识别该短语。

这可以进一步调整,但让我们首先看看它的作用(我无法测试)。

文档还提供了一些其他可能有用的方法,特别是 readlinestreamline。由于这都是相当低的级别,所以还有其他方法,但如果您完成了所有其他工作,也许这足以完成它。

关于linux - Perl 设备::串口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40199573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com