in reply to Waiting for Device::Serialport

I do something similar but its a pic 16f877 i read from that polls Dallas One-wire 18s20 temp sensors. i use the following

$ob->read_char_time(5); # avg time between read char $ob->read_const_time(500); # timeout after 500 milliseconds = +0.5 seconds
I also am looking for complete lines so i use
my $ob = tie (*FH, 'Device::SerialPort', $cfgfile) || die "Can't tie: $!\n"; ## TIEHANDLE ##
and to read in all available lines i use
@gotits=<FH> ;
This seems to work well for me, but i can get a bunch of lines all at once for while i too only cycle every 15 seconds a cycle reads about 50 18s20 sensors 6 at a time and there may not be much time between the lines for each sensor.

One thing that may be affecting you is that

$timestamp = uts_to_iso(time());
runs even if you do not want to insert the lines.

Another thing i noticed is repeated calls to dt(). saying

my $dtdate=dt('date'); my $dttime=dt('time');
and then using the variables in the execute may speed things up.

and a last observation is that each insert cycle you run the $dbh->prepare($q); pulling these out of the while loop such that

$q = "insert into weather_data values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? +, ?, ?, ?, ?, ?, ?)"; my $sth = $dbh->prepare($q);
is only run once, nd the loop code just uses $sth->execute(...); may speed things up a whole lot.