简要概述...我家里有一个油箱监视器,它通过串行端口输出数据,包括油箱中的油位。在大多数情况下,输出是一致的,但在小时和随机“特殊事件”上,它发送的内容略有不同。
这是一个从端口、换行符等转储的示例。作为原始示例。
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”值是多少,但我希望它是从传感器到油箱中油表面的距离!时间会证明一切。