#!/usr/bin/perl # ### this module package GPS::NMEAserial; use strict; use warnings; # serial port communication use Device::SerialPort qw( :PARAM :STAT 0.07 ); # flush output of filehandle use IO::Handle; # create filehandles use Symbol qw( gensym ); sub new_nmea_port { my $class = shift; # open the serial port attached to control unit # $quiet parameter just for compatability my ( $port, $config_file, $quiet ) = @_; # this tests for an existing config file, # and creates one if necessary... if ( !-e $config_file ) { my $PortObj = new Device::SerialPort( $port, $quiet ) or die("Can't open $port: $!"); $PortObj->baudrate(4800); $PortObj->parity('none'); $PortObj->databits(8); $PortObj->handshake('none'); # when nmea data is available every second $PortObj->read_const_time(1100); $PortObj->read_char_time(700); $PortObj->stopbits(1); $PortObj->write_settings or undef $PortObj; $PortObj->save($config_file) or die("Can't save $config_file: $!"); # close serial port $PortObj->close or warn("Close $PortObj at $port failed: $!"); # destroy serial object # frees memory back to perl undef $PortObj; } else { print("$config_file already exists!"); } # tie filehandle to read/write from serial port (nmea device) my $fh = gensym(); tie( *$fh, 'Device::SerialPort', $config_file ) or die("Can't tie $port: $!"); my $self = bless { PortName => $port, FileHandle => $fh, ConfigurationFileName => $config_file }, $class; $self->{'FileHandle'}->autoflush(1); return $self; } # this shouldn't be necessary sub destroy_create_fh { my $self = shift; my $fh_self = $self->{'FileHandle'}; tie( *$fh_self, 'Device::SerialPort', $self->{'ConfigurationFileName'} ) or die("Can't tie $self->{'PortName'}: $!"); $self->{'FileHandle'} = $fh_self; } sub get_heading { my $self = shift; if ( !-e $self->{'PortName'} ) { warn("Device $self->{'PortName'} doesn't exist"); } $self->destroy_create_fh(); while ( my $line = readline( $self->{'FileHandle'} ) ) { print "Do something with $line"; return $line; } } 1; #### use strict; use warnings; use lib '/usr/local/lib'; use GPS::NMEAserial; my $nmea_unit = GPS::NMEAserial->new_nmea_port( '/dev/nmea', "/var/run/.nmea_unit.conf" ); my $heading_string = $nmea_unit->get_heading(); print "$heading_string\n"; sleep(10); my $heading_string2 = $nmea_unit->get_heading(); print "$heading_string2 is not most recent value\n"; #### # tie filehandle to read/write from serial port (nmea device) my $fh = gensym(); tie( *$fh, 'Device::SerialPort', $config_file ) or die("Can't tie $port: $!"); my $self = bless { PortName => $port, FileHandle => $fh, ConfigurationFileName => $config_file }, $class; $self->{'FileHandle'}->autoflush(1); return $self;