I took your code, replaced $^E with $!, and it ran fine... maybe some strange quirk on your modem? Maybe for some reason there aren't 4 bytes from the modem for the script to read, so the call to sysread is blocking?
Comment on Re: Accessing serial ports under Windows