Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine

Re: Detect STX and ETX hex in received string

by GrandFather (Sage)
on Nov 28, 2012 at 23:49 UTC ( #1006128=note: print w/ replies, xml ) Need Help??

in reply to Detect STX and ETX hex in received string

I'd use a state machine and to avoid manifest global variables I'd wrap it up in a light weight object:

#!/usr/bin/perl use strict; use warnings; use Win32::SerialPort; my $kSTX = "\x02"; my $kETX = "\x03"; my $obj = bless { port => Win32::SerialPort->new('COM1'), idle => 1 }; $obj->configurePort(); while (1) { my $crc = $obj->readSerialPort(); next if !defined $crc; print $obj->{buffer}; } continue { sleep 1; } sub configurePort { my ($self) = @_; $self->{port}->...; } sub writeSerialPort { my ( $self, $outStr ) = @_; $self->{port}->write($outStr) || die "Serial port write failed: $! +\n"; } sub readSerialPort { my ($self) = @_; while ( my $byte = $self->{port}->input() ) { next if $self->{idle} && $byte eq $kSTX; if ( $byte eq $kSTX ) { $self->{buffer} = ''; $self->{idle} = undef; next; } if ( $byte ne $kETX && 80 > length $self->{buffer} ) { $self->{buffer} .= $byte; next; } # Got end of record my $crc = 0; $crc += ord($_) for split '', $self->{buffer}; $crc &= 0xFF; $self->{idle} = 1; return $crc; } return; }

The code assumes that the input function times out after some reasonable time and that nulls are not used in the payload data. None of this is tested code!

Note too the use of strictures - always use strictures (use strict; use warnings;)

True laziness is hard work

Comment on Re: Detect STX and ETX hex in received string
Download Code

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1006128]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (3)
As of 2015-10-07 01:36 GMT
Find Nodes?
    Voting Booth?

    Does Humor Belong in Programming?

    Results (169 votes), past polls