Thanks for the example - just to pick a couple nits:
- eval "..."; die $@ if $@; has issues, eval "...; 1" or die $@; is better
- Indirect Object Syntax is discouraged, Win32::SerialPort->new($port, 1) is better
- Instead of evaling a use, in this case a require is enough.
- You don't need the duplicate $IS_WINDOWS, it's easier to do my $IS_WINDOWS; BEGIN { $IS_WINDOWS = ...