2011-08-05 6 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})...... 

(.) 1人のキャラクター、(.{7})手段それらの7を意味します。

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

手段、入力として1011.....を与え、AC1なり、DC0auto/unknown1であろう1であろう。

Digit1/2/3/4は数字です。dot1 ... dot4は、小数点をどこに置くかを示します。

auto/diode_test/..モードを言う。..

ohm/volt/....あなたが使用しているユニットと言います。

残りはかなり簡単です。

関連する問題