нужна помощь, чтобы понять сценарий Perl - PullRequest
0 голосов
/ 05 августа 2011

Я работаю над последовательной связью с мультиметром VA18B, который использует протокол данных PC Link. Проблема в том, что я не могу найти документацию для этого протокола. Единственное, что у меня есть, это скрипт на 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;
}

1 Ответ

5 голосов
/ 05 августа 2011

Эта функция принимает двоичную (0/1) строку. Регулярное выражение - это шаблон:

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

(.) означает одного персонажа, (.{7}) означает 7 из них.

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

означает, что, учитывая 1011..... в качестве входных данных, AC будет 1, DC будет 0, а auto / unknown1 будет 1.

Цифра 1/2/3/4 - это цифры, dot1 ... dot4 указывает, где вы ставите десятичную точку.

auto / diode_test / .. скажем, режим ..

ohm / volt / .... скажите, какое устройство вы используете.

Остальное довольно просто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...