Perl Regex从不规则的串口输出中获取数据

时间:2012-11-20 19:05:37

标签: regex perl serial-port data-processing

简要概述......我家里有一个油箱监控器,通过串口输出数据,包括油箱中的油位。在大多数情况下,输出是一致的,但在小时和随机的“特殊事件”上,它会发送一些略有不同的内容。

以下是从端口转储的示例,换行符等。作为原始。

20:23,Ull=000
20:24,Ull=000

RX:033 CMs,048 *F
20:25,Ull=000
20:26,Ull=000
20:29,Ull=000
RX:033 CMs,051 *F (Fast)
Chosen:0,Hour:10,033 CMs,051 *F

RX:033 CMs,051 *F (Fast)
Chosen:0,Hour:10,033 CMs,051 *F
20:34,ull=000

我想从这个输出中提取的是在这种情况下'ull ='之后的数字000但数字总是一个3位整数,并且总是有前导0即。 '033'或'001'或'259'

当它没有发送'HH:MM,ull = nnn'格式时,输出可以被忽略,因为它只会持续10分钟最多再返回标准输出

使用我的电力监视器作为模板,我的电力监视器工作类似但输出更稳定我已经提出......

#!/usr/bin/perl -w

# Read data from oil tank sensor via USB-serial port.

use strict;
use Device::SerialPort qw( :PARAM :STAT 0.07 );
use WWW::Mechanize;

open STDERR, '>/dev/null';

my $PORT = "/dev/ttyUSB2";
my $ob = Device::SerialPort->new($PORT);
$ob->baudrate(115200);
$ob->write_settings;

open(SERIAL, "+>$PORT");
while (my $line = <SERIAL>) {
    if ($line =~ m!ull=(\d+)!) { # trying and failing to extract the data on this line

my $oil = $1*1234;              # once the value is successfully captured I'll process
                                # it and send it for viewing & storage on the internet.


#send the oil volume value to emoncms (this section works ok.)
my $ua = WWW::Mechanize->new();
my $url = "http://emoncms.org/input/post?json={oil:$oil}&apikey=MY API KEY";
my $response = $ua->get($url);

    }

}

这只是在后台运行。

我认为字符串中的','或'='可能会让我感到沮丧,因为我可以将字符串的其他随机部分输入到变量中,但从来没有我需要的值。任何帮助将不胜感激,因为我似乎使用了我能想到的所有符号的随机组合{} *。!m \ // g / \ n!等等......以及其他什么都无济于事!!

这是一种实验,因为我甚至不能100%确定'ull'值是什么,但我希望它是从传感器到油箱表面的距离!时间会证明。

1 个答案:

答案 0 :(得分:0)

那是因为你试图将你的正则表达式与完整的字符串相匹配,但事实并非如此。由于ull=(\d+)与包含该模式的长字符串不匹配。它只会匹配完全匹配该模式的字符串。

此外,如果您的号码肯定是length 3,那么您可以在正则表达式中明确指定。那里你不需要+量词。而是{3}量词,或0\d{2},因为您的号码以0开头。并添加i标记,以case-insensitive方式进行匹配。

尝试使用: -

if ($line =~ m!.*?ull=(0\d{2}).*!i)