Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Perl设备::串行端口_Linux_Perl_Serial Port_Tty - Fatal编程技术网

Linux Perl设备::串行端口

Linux Perl设备::串行端口,linux,perl,serial-port,tty,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/) { pr

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

感谢您的提示

也许更愿意为字符串编制索引

($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");
}

看起来您正在使用模块,或者可能是哪个模块

提供与Win32::SerialPort模块提供的基本相同的基于对象的用户界面

它的方法
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;
}
我们一次读取少量字节,以防止轮询或阻塞读取出现问题,这些问题是由注释引起的。看

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

这可以进一步调整,但让我们先看看它目前的功能(我无法测试)


文档还提供了一些其他可能有用的方法,特别是
readline
streamline
。由于这是一个相当低的水平,还有其他的方法,但如果你让所有其他方法都工作起来,也许这就足以完成它。

也许大家都很清楚,但问题是什么?什么是
$ob->read
?$ob->read打印正确的启动消息,但大多数时候它都忽略了该关键字。在putty控制台中,一旦用户看到关键字进入设备配置菜单,就必须按Enter键,否则启动将继续正常进行(类似于PC重启,然后用户按F2键进入BIOS菜单)。perl是不是太慢了,所以要做出反应?谢谢你的解释。但是它是什么课程/模块?
read
方法返回什么?你在读两个变量,哪个得到什么?“错过那个关键词”是什么意思?如果它收到带有关键字的消息,它怎么会错过它呢?
read
可以在打印时一次提供一行吗?然后,您可以在收到每一行时执行
(读取(…)
并检查消息。例如您能告诉我们$ob来自哪个类/模块吗?或者你能澄清一下
read
的作用/方式吗?嗨,这是我的第一个串口脚本,因此无法进一步评论。现在,我可以通过从开始发送“\n”来停止启动消息(不检测Booting\u up关键字)。效果仍然相同,停止启动消息。但是现在看到在发送$ob->write(“\n\n”)后出现的奇怪行为我不能在后续的$ob->write
$ob->write(“\n\n”)中发送超过16个字符;睡眠3$ob->write(“cmd”);//cmd长度只有16个字符
这里的第一个代码块可能没有达到我们预期的效果。退出条件似乎不正确。我不知道read(300)的具体行为,但它要么在文件关闭时返回较少的字节,要么在暂停时返回较少的字节,自上次读取()以来没有300个字节可读取。。。。无论哪种方式,循环出口听起来都不对,因为串口永远不会自动关闭……从文档中可以看出:因为所有绑定方法都会阻塞,所以它们应该始终与超时设置一起使用,并且不适合后台操作和轮询循环。发生超时时,sysread方法返回的字符数可能少于请求的字符数。方法调用仍然被认为是成功的。如果系统读取在接收到某些字符后超时,实际经过的时间可能是编程限制的两倍。如果没有收到字节,则正常计时。@BenPen虽然文档没有说太多,但它们确实说
$count
是读取的字节数,并提供了一个与我的
最后一个…
语句非常相似的示例。所以我认为循环退出是好的。不清楚的是,
$result
是否已填充,但必须尝试一下。@BenPen为什么引用绑定的方法?
read
就是其中之一吗?看起来不是。至于超时,这是另一个问题。OP没有提供细节。唯一清楚的是,它可能没有读取足够的数据。我将等待关于它如何工作(或不工作)的澄清。好吧,如果您查看I/O模式,就会发现轮询或阻塞。阻塞读取等待300个字节准备就绪,并且poling会立即返回它拥有的所有字节。两者都有问题,对吗?如果输出暂停,一个会阻塞最后300字节,另一个会过早退出循环。