#! /usr/bin/perl -w # $Id: qm1538.perl,v 1.1 2007/08/30 22:33:52 philip Exp $ use strict; use Device::SerialPort; my $device = "/dev/cuaU0"; my $port=new Device::SerialPort($device) || die "new($device): $!\n"; $port->handshake("none"); $port->baudrate("2400"); $port->databits("8"); $port->parity("none"); $port->stopbits("1"); my @l; my $minus; my $p1; my $p2; my $p3; my $d1; my $d2; my $d3; my $d4; $port->read_char_time(0); # Don't wait $port->read_const_time(1000); # 1 second per unfulfilled read call # lookup table to convert random gibberish into digits. my @lookup; $lookup[125] = 0; $lookup[5] = 1; $lookup[91] = 2; $lookup[31] = 3; $lookup[39] = 4; $lookup[62] = 5; $lookup[126] = 6; $lookup[21] = 7; $lookup[127] = 8; $lookup[63] = 9; my $timeout = 10; my $display = ""; while ( $timeout > 0 ){ # grab a buffer full of data (up to 16 bytes) my($count,$saw) = $port->read(16); if ( $count > 0 ){ $timeout = 10; my @buffer = split(//,$saw); while ( my $b = shift @buffer ){ $b = unpack('C',$b); # mask off high nibble my $h = $b & 240; $h = $h >> 4; # and each bit of low nibble $l[$h][0] = $b & 1; $l[$h][1] = $b & 2; $l[$h][2] = $b & 4; $l[$h][3] = $b & 8; if ( $h == 14 ){ $minus = $l[2][3]; $p1 = $l[4][3]; $p2 = $l[6][3]; $p3 = $l[8][3]; $d1 = hex sprintf("%x%x", $l[2][2] + $l[2][1] + $l[2][0], $l[3][3] + $l[3][2] + $l[3][1] + $l[3][0]); $d2 = hex sprintf("%x%x", $l[4][2] + $l[4][1] + $l[4][0], $l[5][3] + $l[5][2] + $l[5][1] + $l[5][0]); $d3 = hex sprintf("%x%x", $l[6][2] + $l[6][1] + $l[6][0], $l[7][3] + $l[7][2] + $l[7][1] + $l[7][0]); $d4 = hex sprintf("%x%x", $l[8][2] + $l[8][1] + $l[8][0], $l[9][3] + $l[9][2] + $l[9][1] + $l[9][0]); $display = ""; if ( $minus ) { $display = "-"; } $display .= $lookup[$d1]; if ( $p1 ) { $display .= "."; } $display .= $lookup[$d2]; if ( $p2 ) { $display .= "."; } $display .= $lookup[$d3]; if ( $p3 ) { $display .= "."; } $display .= $lookup[$d4]; print time, "\t$display\n"; } } } else { $timeout--; } } $port->close or die "Couldn't close serial port: $!\n"; exit;