为什么我的Perl脚本在不使用硬编码值时打印的值不正确?

时间:2016-07-07 07:53:33

标签: perl

我使用A / D转换器来获得电导率探头的一些结果。我使用Sparky's Widgets的miniEC接口。我们运行校准并获得斜率和截距值。当我在静态脚本中使用此校准测试此值时,结果是正确的。

看到这里,不是一件大事,而是证明我的校准效果很好。结果是正确的。

#!/usr/bin/perl

my $slope     = "0.048684077307972626";
my $intercept = "24.831896523430906";

$ECdec = 62.5;

print "$ECdec \n";

###lin
$EC1 = ( ( $ECdec - $intercept ) / $slope );

print "Electric Conductivity $EC1 µS/m \n";

输出是:

62.5
Electric Conductivity 773.725323749752 �S/m 

当我将静态值$ECdec交换到A / D转换器的输出并尝试获得结果时,这是完全错误的。谁能看到我的失败?

这是Perl,它从转换器读取探测值,交换字节,将其转换为十进制,然后添加线性回归。我做错了什么?

    #!/usr/bin/perl

my $dir = '/var/www/motion';

my $slope = "0.048684077307972626";
my $intercept = "24.831896523430906";

###get value 
my $EC = `sudo i2cget -y 1 0x4a 0x00 w` ;

print "$EC \n";

###swap 
my $ECswap = $EC;
substr $ECswap, 4, 0, substr $ECswap, 2, 2, q();

print "$ECswap \n";

###convert to decimal
$ECdec = hex($ECswap);

print "$ECdec \n";

$ECvalue = ($ECdec - $ECintercept)/$slope);

print "$ECvalue"
#$rrd = `/usr/bin/rrdtool update $dir/homeec.rrd N:$ECdec`;

####system ("clear");
print "Electric Conductivity $ECdec µS/m \n";

这里的输出是:

0x5303 
0x0353
851 
Electric Conductivity 16969.9858590372 �S/m 

1 个答案:

答案 0 :(得分:1)

您正在输出中打印$ECdec而不是$ECvalue

此外,请始终发布您的真实代码。您显示的程序将无法编译,显然不是给您带来问题的程序

这是你的程序看起来的样子

必须始终 use strictuse warnings 'all'在最琐碎的Perl程序的顶部,并使用my

如果您的代码包含非ASCII字符,例如microSiemens中的希腊语mu use utf8,则应始终µ。 Perl不支持7位ASCII或UTF-8以外的其他编码源代码。我不知道您的终端是否需要UTF-8字符,您可能需要更改use open语句

我已将您对i2cget的调用注释掉,以检索实际值并替换为常量字符串

我还在将字节换成速度之前将十六进制字符串转换为二进制字符串,但它远非关键,如果您发现它更具可读性,则应保留字符交换。我会使用正则表达式并像这样写

die unless $EChex =~ /0x(\p{hex}{2})(\p{hex}{2})/;
my $EC = hex($2.$1);
#!/usr/bin/perl

use utf8;
use strict;
use warnings 'all';
use open qw/ :std :encoding(utf8) /;

use constant DIR       => '/var/www/motion';
use constant SLOPE     => 0.048684077307972626;
use constant INTERCEPT => 24.831896523430906;

# my $EChex = `sudo i2cget -y 1 0x4a 0x00 w` ;
my $EChex = '0x5303';
printf "\$EChex = %s\n", $EChex;

my $EC = hex $EChex;
printf "\$EC = %s\n", $EC;

$EC = (($EC & 0xFF00) >> 8) | (($EC & 0xFF) << 8); # swap bytes

my $ECvalue = ($EC - INTERCEPT) / SLOPE;

printf "Electric Conductivity %.3fµS/m \n", $ECvalue;

输出

$EChex = 0x5303
$EC = 21251
Electric Conductivity 16969.986µS/m