我正在使用使用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 :(得分:5)
此函数采用二进制(0/1)字符串。正则表达式是一种模式:
/^(.)(.).....(.{7})......
(.)
表示一个字符,(.{7})
表示其中7个字符。
my ($AC, $DC, $auto, $unknown1.......= shift =~ /^(.)(.)(.)(.) ....
表示,在1011.....
作为输入时,AC
为1
,DC
为0
,auto
/ {{1}将是unknown1
。
Digit1 / 2/3/4是数字,1
... dot1
告诉你把小数点放在哪里。
dot4
/ auto
/ ..说模式..
diode_test
/ ohm
/ ....说出您正在使用的单位。
其余的很容易。