寻找在电路板启动消息期间检测一个关键字的正确方法。 检测到关键字后,请在一秒钟后发送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");
}
感谢提示
答案 0 :(得分:1)
您似乎正在使用Win32::SerialPort模块,或者Device::SerialPort
提供了一个基于对象的用户界面,与Win32 :: SerialPort模块提供的用户界面基本相同。
它的方法read
获取要读取的字节数,并返回读取的数字并将它们写入给定的字符串。
您可能<&34; 缺少&#34;这句话因为它超过了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;
}
我们一次只读取少量字节,以防止{em>轮询或阻止读取出现问题,并在BenPen的评论中提出。请参阅Configuration and capability methods。
您可以先读取模式中前一个300字节,然后一次开始读取一些(或一个),这也可以最快地识别短语。
这可以进一步调整,但让我们先看看它的作用(我无法测试)。
文档还提供了一些可能有用的其他方法,尤其是readline
和streamline
。由于这一切都处于相当低的水平,还有其他方法,但如果你有其他所有工作,也许这足以完成它。
答案 1 :(得分:0)
或许更喜欢索引字符串?
($count, $result) = $ob->read(300); # at least 300 chars coming till keyword appear
$substring = 'Booting_up';
if (index($result, $substring) != -1) {
print "send Enter ..\n";
sleep 1;
$ob->write("\r\n");
}