From: Dobrica Pavlinusic Date: Tue, 27 Jul 2010 15:06:22 +0000 (+0200) Subject: read whole response and check crc X-Git-Tag: RFID-Biblio-0.02~138 X-Git-Url: http://git.rot13.org/?p=Biblio-RFID.git;a=commitdiff_plain;h=bd04ced1de5b9a9f7b556948d864581d62ff6867 read whole response and check crc --- diff --git a/lib/RFID/Serial/3M810.pm b/lib/RFID/Serial/3M810.pm index 9a01e1b..41fd380 100644 --- a/lib/RFID/Serial/3M810.pm +++ b/lib/RFID/Serial/3M810.pm @@ -67,23 +67,22 @@ sub cmd { $r_len = $port->read(3); } - # FIXME sometimes, reader returns left-over junk - if ( ! ord(substr($r_len,0,1)) && 0xD0 ) { - warn "INVALID reponse ",as_hex($r_len); - my $c; - while ( $c ne "\xD6" ) { - $c = $port->read(1) || return; - warn "# c ",as_hex($c); - } - $r_len = $c . $port->read(2); - warn "FIXED ",as_hex($r_len); - } - wait_device; my $len = ord( substr($r_len,2,1) ); $data = $port->read( $len ); - warn "<< ", as_hex($r_len,$data)," $len\n"; + + while ( length($data) < $len ) { + warn "# short read ", length($data), " < $len\n"; + wait_device; + $data .= $port->read( $len - length($data) ); + } + + warn "<< ", as_hex($r_len,$data), + ' | ', + substr($data,-2,2) eq checksum(substr($r_len,1).substr($data,0,-2)) ? 'OK' : 'ERROR', + " $len bytes\n"; + $coderef->( $data ) if $coderef;