Perl Device :: SerialPort

时间:2016-10-23 04:39:17

标签: linux perl serial-port tty

寻找在电路板启动消息期间检测一个关键字的正确方法。 检测到关键字后,请在一秒钟后发送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");
}

感谢提示

2 个答案:

答案 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字节,然后一次开始读取一些(或一个),这也可以最快地识别短语。

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

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

答案 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");
}