sub readSerialPort { my $stx_rx = 0; my $etx_rx = 0; my $nak = 0; @buffer = (); # Empty the buffer before the next packet read while ((!$etx_rx) || ((!$etx_rx) && ((scalar(@buffer) > 79)))) { $byte=$port->read(1); if (ord($byte) == 0) #if it's a space, skip { next; } if (($byte eq chr(0x15) && (scalar(@buffer) < $MAX_BUFFER))) # if a NAK is found anywhere and the buffer is not filled yet { print "\nNAK was found! " . $byte . "\n"; $nak = 1; $retry_if_fail = 1; # Flag to tell the script to continue waiting for the proper packet after buffer reset print "\nRetry var changed to " . $retry_if_fail . "\n"; STDOUT -> flush(); print "BUFFER RETURNED WITH NAK => " . @buffer . "\n\n"; return; } if ($byte eq chr(0x02)) # if it's STX run this condition { $stx_rx = 1; print "\nSTX was found! " . $byte . "\n"; } elsif (($stx_rx == 1) && ($byte eq chr(0x03))) # if both the STX and ETX are found { print "\nETX was found! " . $byte . "\n"; $etx_rx = 1; $retry_if_fail = 0; # Zero indicates the SUCCESS condition STDOUT -> flush(); print "BUFFER RETURNED AT ALL OKAY => " . @buffer . "\n\n"; print "BUFFER RETURNED AT ALL OKAY => " . join("",@buffer) . "\n\n"; } if (($stx_rx == 1) && ($etx_rx == 0) && ((scalar(@buffer) > ($MAX_BUFFER-1)))) # if only STX was found within 80 bytes { print "\nOnly STX was found! " . $byte . "\n"; $retry_if_fail = 1; # Flag to tell the script to continue waiting for the proper packet after buffer reset print "\nRetry var changed to " . $retry_if_fail . "\n"; STDOUT -> flush(); print "BUFFER RETURNED WITH ONLY STX => " . @buffer . "\n\n"; return; } if (($stx_rx == 0) && ($etx_rx == 0) && scalar(@buffer) > ($MAX_BUFFER-1)) { print "\n80 bytes seen but no STX/ETX was found within 80 byte range! " . $byte . "\n"; $retry_if_fail = 1; # Flag to tell the script to continue waiting for the proper packet after buffer reset print "\nRetry var changed to " . $retry_if_fail . "\n"; STDOUT -> flush(); print "BUFFER RETURNED with no STX or ETX=> " . @buffer . "\n\n"; return; } push(@buffer, $byte); #if($retry_if_fail == 0) { # until (@buffer eq chr(0x02)) # { # shift(@buffer); # } # return @buffer; #} print "Contents of buffer is " . join("",@buffer) . "\n"; print "Buffer length is " . scalar(@buffer) . "\n"; print "Byte received : ".$byte."\n"; } } while(1) { STDOUT -> flush(); if ($retry_if_fail == 1) { # FAILED CONDITION readSerialPort(); print "Total Received Packet on failure was: " . join("",@buffer) . "\n\n"; print "Error encountered! Continuing to look for incoming packets.\n"; } else { # SUCCESS CONDITION print "Okay cool I found what I was looking for -> " . @buffer . "\n\n"; print "Okay cool I found what I was looking for -> " . join("",@buffer) . "\n\n"; $retry_if_fail = 0; # Time to exit this loop and get on with life!! last; } }