Dear Bretheren, I have this great gadget, called the BMV-600s, a battery monitor, which with a means of a shunt is capable of very precise estimation of state of charge of my battery array (which is powerd by solar panels). Long story short. The device transmitts data via an RS238 interface. It send out the following data every 1 second:
V 24453 I -717 CE -23571 SOC 835 TTG 4559 Alarm OFF Relay OFF AR 0 BMV 600S FW 212 Checksum � 4: H1 -27277 H2 -27277 H3 0 H4 0 H5 0 H6 -48242 H7 17697 H8 28750 H9 140703 H10 1 H11 0 H12 0 Checksum
This is the code I use to get this data:
#!/usr/bin/perl use warnings; use strict; use Device::SerialPort; my $ccnt; my $string; my $port = '/dev/ttyUSB0'; my $conf = '~/.conf'; my $ob = Device::SerialPort->new($port, 1) || die "Can't open $port: $ +!"; my $STALL_DEFAULT = 10; my $timeout = $STALL_DEFAULT; my $arb = $ob->can_arbitrary_baud; my $data = $ob->databits(8); my $baud = $ob->baudrate(19200); my $parity = $ob->parity("none"); my $hshake = $ob->handshake("rts"); my $stop = $ob->can_stopbits; my $rs = $ob->is_rs232; my $total = $ob->can_total_timeout; $ob->stopbits(1); $ob->buffers( 4096, 4096 ); $ob->can_baud; $ob->can_databits; $ob->can_dtrdsr; $ob->can_handshake; $ob->can_parity_check; $ob->can_parity_config; $ob->can_parity_enable; $ob->can_rtscts; $ob->can_xonxoff; $ob->can_xon_char; $ob->can_spec_char; $ob->can_interval_timeout; $ob->can_ioctl; $ob->can_status; $ob->can_write_done; $ob->can_modemlines; $ob->can_wait_modemlines; $ob->can_intr_count; $ob->write_settings; print "A = $arb\n", "B = $baud\n", "D = $data\n", "S = $stop\n", "P = $parity\n", "H = $hshake\n", "R = $rs\n", "T = $total"; my ($count, $string); while(1) { $ccnt++; $ob->are_match("Checksum", "\n"); ($count, $string) = $ob->read(500); #read 500 bytes #print "$ccnt: count=$count string=$string\n\n" if ($string); #$string =~ m/(.*?)V\t(\d*)\n\rI\t(\d*)\n\rCE\t(\d*)\n\rSOC\t( +\d*)\n\rTTG\t(\d*)\n\r(.*?)/; #my ($v, $i, $ce, $soc, $ttg, $more) = ($1,$2,$3,$4,$5,$6); #print "$ccnt: ($v, $i, $ce, $soc, $ttg, $more)\\n"; $string =~ m/V\t\d*\n/; print "$ccnt: $string\n"; sleep(1); } $ob->write_drain; $ob->close; undef $ob
Hence 2 questions: 1. How do I parse the data that I get? 2. How do I configure the READ from the COM port so it syncs with the transmission? riht now I'm just somehow getting chuncs of data via
($count, $string) = $ob->read(500); #read 500 bytes
, and the $ob->are_match("Checksum", "\n"); does not really work (The word Checksum with a hex value actually closes the one batch of data transmission). A great many thanks to all!

In reply to parse data from serial port by pashanoid

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.