我正在使用使用PC Link数据协议的万用表VA18B进行串行通信.问题是我找不到该协议的任何文档.我唯一得到的是一个解码帧的Perl脚本(据我所知,帧由14个字节组成).不幸的是,对于根本不了解Perl的人来说,脚本非常复杂.
有人可以解释下面的代码吗?
sub decode_bin_str {
my ($AC, $DC, $auto, $unknown1,
$minus, $digi1, $dot1, $digi2, $dot2, $digi3, $dot3, $digi4,
$micro, $unknown2, $kilo, $diode_test,
$milli, $percent, $mega, $cont_check,
$unknown3, $ohm, $rel, $hold,
$amp, $volt, $hz, $unknown4,
$min, $unknown5, $celsius, $max) = shift =~
/^(.)(.)(.)(.)(.)(.{7})(.)(.{7})(.)(.{7})(.)(.{7})
(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.) *$/x;
my %digi = (
"1111101" => 0,
"0000101" => 1,
"1011011" => 2,
"0011111" => 3,
"0100111" => 4,
"0111110" => 5,
"1111110" => 6,
"0010101" => 7,
"1111111" => 8,
"0111111" => 9,
);
my $val = ($minus ? "-" : "") . $digi{$digi1} . ($dot1 ? "." : "") .
$digi{$digi2} . ($dot2 ? "." : "") .
$digi{$digi3} . ($dot3 ? "." : "") .
$digi{$digi4};
my $flags = join(" ", $AC ? "AC" : (),
$DC ? "DC" : (),
$auto ? "auto" : (),
$diode_test ? "diode_test" : (),
$cont_check ? "cont_check" : (),
$rel ? "rel" : (),
$hold ? "hold" : (),
$min ? "min" : (),
$max ? "max" : ());
my $unit = ($micro ? "u" : "") .
($kilo ? "k" : "") .
($milli ? "m" : "") .
($mega ? "M" : "") .
($percent ? "%" : "") .
($ohm ? "Ohm" : "") .
($amp ? "A" : "") .
($volt ? "V" : "") .
($hz ? "Hz" : "") .
($celsius ? "C" : "");
$val, $flags, $unit;
}
此函数采用二进制(0/1)字符串.正则表达式是一种模式:
/^(.)(.).....(.{7})......
Run Code Online (Sandbox Code Playgroud)
(.)意思是一个字符,(.{7})意思是其中的一个.
my ($AC, $DC, $auto, $unknown1.......= shift =~ /^(.)(.)(.)(.) ....
Run Code Online (Sandbox Code Playgroud)
意味着1011.....作为输入,AC将是1,DC将是0和auto/ unknown1将是1.
Digit1/2/3/4是数字,dot1... dot4告诉你把小数点放在哪里.
auto/ diode_test/ ..说模式..
ohm/ volt/ ....说你正在使用哪个单位.
其余的很简单.