0
我正在使用PC Link數據協議的萬用表VA18B進行串行通信。 問題是我找不到這個協議的任何文檔。我唯一得到的是一個解碼幀的Perl腳本(據我所知,該幀由14個字節組成)。不幸的是,對於一個根本不瞭解Perl的人來說,這個腳本非常複雜。需要幫助瞭解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; }
對於除了你以外的任何人,對整個子程序的逐行解釋不太可能有幫助。如果你在處理Perl(注意拼寫,它不叫'PERL'),那麼學習Perl。它有一個全面的手冊(並且該代碼似乎不使用核心語言以外的任何內容)。如果一個特定的部分導致你的問題,那麼在這裏問一個更具體的問題可能是值得的。 – Quentin
@Quentin我並不需要一行一行的解釋。我認爲J-16SDiZ的答案足以「解碼」這個協議。 – kmalmur