2011-08-05 330 views
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; 
} 
+3

對於除了你以外的任何人,對整個子程序的逐行解釋不太可能有幫助。如果你在處理Perl(注意拼寫,它不叫'PERL'),那麼學習Perl。它有一個全面的手冊(並且該代碼似乎不使用核心語言以外的任何內容)。如果一個特定的部分導致你的問題,那麼在這裏問一個更具體的問題可能是值得的。 – Quentin

+0

@Quentin我並不需要一行一行的解釋。我認爲J-16SDiZ的答案足以「解碼」這個協議。 – kmalmur

回答

5

該函數採用二進制(0/1)字符串。正則表達式是一個圖案:

/^(.)(.).....(.{7})...... 

(.)表示一個人物造型,(.{7})指其中7。

my ($AC, $DC, $auto, $unknown1.......= shift =~ /^(.)(.)(.)(.) .... 

手段,給出1011.....作爲輸入,AC1DC0auto/unknown11

Digit1/2/3/4是數字,dot1 ... dot4告訴你放小數點的位置。

auto/diode_test/..說..模式

ohm/volt/....比方說你正在使用的單元。

其餘的很容易。