2011-08-05 5 views
0

PC 링크 데이터 프로토콜을 사용하는 멀티 미터 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; 
} 
+3

전체 서브 루틴을 한 줄씩 설명하면 다른 사람에게는 도움이되지 않을 것입니다. 당신이 Perl을 다루고 있다면 (철자를 적어 놓으면 PERL이라고 부르지 않습니다) Perl을 배우십시오. 그것은 포괄적 인 매뉴얼을 가지고 있습니다 (그리고 그 코드는 핵심 언어 이외의 것을 사용하는 것으로 보이지 않습니다). 특정 부품으로 인해 문제가 발생하는 경우 여기에서 묻는 것이 더 구체적인 질문입니다. – Quentin

+0

@Quentin 필자는 라인별로 설명 할 필요가 없다. 나는 J-16SDiZ의 대답이이 프로토콜을 "해독"하는데 충분하다고 생각한다. – kmalmur

답변

5

이 함수는 2 진 (0/1) 문자열을 사용합니다.

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

(.) 하나 charactor가 (.{7}) 그들의 7 수단 의미 : 정규식은 패턴이다. 입력으로서 주어진 1011.....

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

수단은, AC1, DC0auto 및/unknown11이됩니다 될 것이다.

Digit1/2/3/4는 숫자이며, dot1 ... dot4은 소수점을 어디에 두는 지 알려줍니다.

auto/diode_test/.. 말할 모드 ..

ohm/volt

/.... 당신이 사용하고있는 단위 말한다.

나머지는 매우 쉽습니다.

관련 문제