in reply to Re: Win32::SerialPort - How do I detect if device is still connected?
in thread Win32::SerialPort - How do I detect if device is still connected?

Hi cavac,

thanks for your reply. My problem is the first one you list. This leads to a hangup, when any write or input actions are tried.

But I found out by accident, that the is_status method of the underlying Win32API::CommPort package provides a non-blocking means to find out, if the serial adapter is still connected. The function returns a list of 4 values if all is OK - usually all 0 - or undef, if the adapter was disconnected.

Luckily is_status is also very light-weight, so I can just call it anytime I try to send something over the port. Of course, there's still a slight chance, that the disconnection happens just between the call to is_status and the call to write or input something via the port, but I can live with that (low) risk.

  • Comment on Re^2: Win32::SerialPort - How do I detect if device is still connected?

Replies are listed 'Best First'.
Re^3: Win32::SerialPort - How do I detect if device is still connected?
by cavac (Prior) on Jul 04, 2024 at 14:09 UTC

    You might be able to fork() the process at startup, where the parent does all the logic and stuff, and the child only does the low level serial communication. Then the parent can periodically check if the child still reacts, and restart it if required.

    I'm not what the best way to do IPC between the processes on Windows, i am a Linux guy. From what i understand, Unix domain sockets (AF_UNIX) are now available when using at least Win10 and a modern version of Perl, otherwise you can just use TCP on localhost.

    I wrote a forked program example (for Linux) in Autoclicker! Cheating is winning, too! (look for the header "VERSION 2") that does inter-process communication. Maybe this is some help to your problem.

      ...except there isn't inter-process communication between forks on Windows because fork() creates a thread. On windows, you should probably just use perl threads instead of fork, since that API has fewer surprises.