I was about to suggest the timeout which always makes sense in serial communication anyway. PJC does not really know that the port was plugged, it only knows that something went wrong and as a safety measure it closes the port internally as it is very unlikely that the port will function without re-opening and because of my experience with RXTX that accessing plugged out port may crash the JVM. That of course may just be RXTX. So yes PJC knows that the port is closed but atm there is now way (without reflection) or modification to query that the port is closed. This is because the original JavaComm spec that RXTX and PJC try to adhere to does not expose that functionality. It would of course be trivial to add that. However read/write should fail with IllegalStateException if the port is closed so you could catch that. br Kusti From: ant elder <ant.elder@xxxxxxxxx<mailto:ant.elder@xxxxxxxxx>> Reply-To: "purejavacomm@xxxxxxxxxxxxx<mailto:purejavacomm@xxxxxxxxxxxxx>" <purejavacomm@xxxxxxxxxxxxx<mailto:purejavacomm@xxxxxxxxxxxxx>> Date: Thu, 21 Nov 2013 15:03:36 +0200 To: "purejavacomm@xxxxxxxxxxxxx<mailto:purejavacomm@xxxxxxxxxxxxx>" <purejavacomm@xxxxxxxxxxxxx<mailto:purejavacomm@xxxxxxxxxxxxx>> Subject: [purejavacomm] Re: Detect usb cable unplugged? Playing around a bit more i see that if i do enableReceiveTimeout(3000) on the PJC SerialPort and then run and pull out the usb cable then after 3 seconds the read gets an IOException with the message "Underlying input stream returned zero bytes". That in itself is not really enough to tell the cable has been pulled, but a subsequent write to the SerialPort then fails with an IOExcpetion with no message from purejavacomm.PureJavaSerialPort$1.write(PureJavaSerialPort.java:651). So PJC knows and has closed the underlying port. But i can't see any way for my code to query PJC to see that the port is now closed. Is there some API call somewhere I could use to see that? ...ant On Thu, Nov 21, 2013 at 10:54 AM, ant elder <ant.elder@xxxxxxxxx<mailto:ant.elder@xxxxxxxxx>> wrote: Sorry, just to be clear, thats actually doing a write followed by a read. ...ant On Thu, Nov 21, 2013 at 10:53 AM, ant elder <ant.elder@xxxxxxxxx<mailto:ant.elder@xxxxxxxxx>> wrote: I've not tried it on Linux yet, but on Windows 7 if i pull out the cable and do a read with PJC logging switched on, the read hangs and this is what logging is output: [err] log: 024372,class purejavacomm.PureJavaSerialPort$1 line 647, thread id 41, Default Executor-thread-6, > write(0,[8192,0x31,0x2C,0x31,0x32,0x2C,0x31,0x0A,0x35...],7) [err] log: 024373,class jtermios.windows.JTermiosImpl line 495, thread id 41, Default Executor-thread-6, > WaitForMultipleObjects(2, [2,native@0x7b0 (jtermios.windows.WinAPI$HANDLE@7b0),native@0x7a8 (jtermios.windows.WinAPI$HANDLE@7a8)], false, -1) [err] log: 024374,class jtermios.windows.JTermiosImpl line 495, thread id 41, Default Executor-thread-6, < WaitForMultipleObjects(2, [2,native@0x7b0 (jtermios.windows.WinAPI$HANDLE@7b0),native@0x7a8 (jtermios.windows.WinAPI$HANDLE@7a8)], false, -1) => 0 [err] log: 024375,class jtermios.windows.JTermiosImpl line 501, thread id 41, Default Executor-thread-6, > GetOverlappedResult(native@0x79c (jtermios.windows.WinAPI$HANDLE@79c), auto-allocated@0x2485010 (32 bytes), [0], false) [err] log: 024376,class jtermios.windows.JTermiosImpl line 501, thread id 41, Default Executor-thread-6, < GetOverlappedResult(native@0x79c (jtermios.windows.WinAPI$HANDLE@79c), auto-allocated@0x2485010 (32 bytes), [7], false) => true [err] log: 024376,class jtermios.windows.JTermiosImpl line 519, thread id 41, Default Executor-thread-6, > ResetEvent(native@0x7b0 (jtermios.windows.WinAPI$HANDLE@7b0)) [err] log: 024377,class jtermios.windows.JTermiosImpl line 519, thread id 41, Default Executor-thread-6, < ResetEvent(native@0x7b0 (jtermios.windows.WinAPI$HANDLE@7b0)) => true [err] log: 024377,class jtermios.windows.JTermiosImpl line 525, thread id 41, Default Executor-thread-6, > WriteFile(native@0x79c (jtermios.windows.WinAPI$HANDLE@79c), [7,0x31,0x2C,0x31,0x32,0x2C...], 7, [7], auto-allocated@0x2485010 (32 bytes)) [err] log: 024378,class jtermios.windows.JTermiosImpl line 525, thread id 41, Default Executor-thread-6, < WriteFile(native@0x79c (jtermios.windows.WinAPI$HANDLE@79c), [7,0x31,0x2C,0x31,0x32,0x2C...], 7, [0], auto-allocated@0x2485010 (32 bytes)) => false [err] log: 024379,class jtermios.windows.JTermiosImpl line 528, thread id 41, Default Executor-thread-6, > GetLastError() [err] log: 024379,class jtermios.windows.JTermiosImpl line 528, thread id 41, Default Executor-thread-6, < GetLastError() => 997 [err] log: 024380,class purejavacomm.PureJavaSerialPort$1 line 647, thread id 41, Default Executor-thread-6, < write(0,[8192,0x31,0x2C,0x31,0x32,0x2C,0x31,0x0A,0x35...],7) => 7 [err] log: 024380,class purejavacomm.PureJavaSerialPort$1 line 673, thread id 41, Default Executor-thread-6, > tcdrain(0) [err] log: 024381,class jtermios.windows.JTermiosImpl line 314, thread id 41, Default Executor-thread-6, > FlushFileBuffers(native@0x79c (jtermios.windows.WinAPI$HANDLE@79c)) [err] log: 024382,class jtermios.windows.JTermiosImpl line 314, thread id 41, Default Executor-thread-6, < FlushFileBuffers(native@0x79c (jtermios.windows.WinAPI$HANDLE@79c)) => true [err] log: 024382,class purejavacomm.PureJavaSerialPort$1 line 673, thread id 41, Default Executor-thread-6, < tcdrain(0) => 0 [err] log: 024458,class purejavacomm.PureJavaSerialPort$2 line 891, thread id 41, Default Executor-thread-6, > select(1,[0],[],[],jtermios.TimeVal@43737616) [err] log: 024459,class jtermios.windows.JTermiosImpl line 788, thread id 41, Default Executor-thread-6, > ClearCommError(native@0x79c (jtermios.windows.WinAPI$HANDLE@79c), [0], [fFlags 0000 cbInQue 0 cbInQue 0]) [err] log: 024460,class jtermios.windows.JTermiosImpl line 788, thread id 41, Default Executor-thread-6, < ClearCommError(native@0x79c (jtermios.windows.WinAPI$HANDLE@79c), [0], [fFlags 0000 cbInQue 0 cbInQue 0]) => true [err] log: 024461,class jtermios.windows.JTermiosImpl line 830, thread id 41, Default Executor-thread-6, > SetCommMask(native@0x79c (jtermios.windows.WinAPI$HANDLE@79c), 0x00000000) [err] log: 024461,class jtermios.windows.JTermiosImpl line 830, thread id 41, Default Executor-thread-6, < SetCommMask(native@0x79c (jtermios.windows.WinAPI$HANDLE@79c), 0x00000000) => true [err] log: 024462,class jtermios.windows.JTermiosImpl line 832, thread id 41, Default Executor-thread-6, > GetOverlappedResult(native@0x79c (jtermios.windows.WinAPI$HANDLE@79c), auto-allocated@0x2485040 (32 bytes), [4], false) [err] log: 024463,class jtermios.windows.JTermiosImpl line 832, thread id 41, Default Executor-thread-6, < GetOverlappedResult(native@0x79c (jtermios.windows.WinAPI$HANDLE@79c), auto-allocated@0x2485040 (32 bytes), [4], false) => true [err] log: 024463,class jtermios.windows.JTermiosImpl line 836, thread id 41, Default Executor-thread-6, > ResetEvent(native@0x7b4 (jtermios.windows.WinAPI$HANDLE@7b4)) [err] log: 024464,class jtermios.windows.JTermiosImpl line 836, thread id 41, Default Executor-thread-6, < ResetEvent(native@0x7b4 (jtermios.windows.WinAPI$HANDLE@7b4)) => true [err] log: 024464,class jtermios.windows.JTermiosImpl line 845, thread id 41, Default Executor-thread-6, > SetCommMask(native@0x79c (jtermios.windows.WinAPI$HANDLE@79c), 0x00000001) [err] log: 024465,class jtermios.windows.JTermiosImpl line 845, thread id 41, Default Executor-thread-6, < SetCommMask(native@0x79c (jtermios.windows.WinAPI$HANDLE@79c), 0x00000001) => true [err] log: 024466,class jtermios.windows.JTermiosImpl line 848, thread id 41, Default Executor-thread-6, > WaitCommEvent(native@0x79c (jtermios.windows.WinAPI$HANDLE@79c), [0], auto-allocated@0x2485040 (32 bytes)) [err] log: 024466,class jtermios.windows.JTermiosImpl line 848, thread id 41, Default Executor-thread-6, < WaitCommEvent(native@0x79c (jtermios.windows.WinAPI$HANDLE@79c), [0], auto-allocated@0x2485040 (32 bytes)) => false [err] log: 024467,class jtermios.windows.JTermiosImpl line 856, thread id 41, Default Executor-thread-6, > GetLastError() [err] log: 024467,class jtermios.windows.JTermiosImpl line 856, thread id 41, Default Executor-thread-6, < GetLastError() => 997 [err] log: 024468,class jtermios.windows.JTermiosImpl line 879, thread id 41, Default Executor-thread-6, > WaitForMultipleObjects(2, [2,native@0x7b4 (jtermios.windows.WinAPI$HANDLE@7b4),native@0x7a0 (jtermios.windows.WinAPI$HANDLE@7a0)], false, 2147483647) On Thu, Nov 21, 2013 at 10:48 AM, Kustaa Nyholm <Kustaa.Nyholm@xxxxxxxxxxxx<mailto:Kustaa.Nyholm@xxxxxxxxxxxx>> wrote: As far as the platform allows/enables PJC read throws an exception if a device is unplugged. Which platform you are using? For Linux and Mac OS X, the inputstream.read() is very thin layer over the POSIX read() and if the OS does not return from a read when the device becomes dysfunctional there is little that can be done. IIRC in that respect OS X did not behave as it should. br Kusti From: ant elder <ant.elder@xxxxxxxxx<mailto:ant.elder@xxxxxxxxx>> Reply-To: "purejavacomm@xxxxxxxxxxxxx<mailto:purejavacomm@xxxxxxxxxxxxx>" <purejavacomm@xxxxxxxxxxxxx<mailto:purejavacomm@xxxxxxxxxxxxx>> Date: Thu, 21 Nov 2013 12:32:06 +0200 To: "purejavacomm@xxxxxxxxxxxxx<mailto:purejavacomm@xxxxxxxxxxxxx>" <purejavacomm@xxxxxxxxxxxxx<mailto:purejavacomm@xxxxxxxxxxxxx>> Subject: [purejavacomm] Detect usb cable unplugged? Is there any way to have an application notified by PureJavaComm when a usb serial port is unplugged? Presently unplugging the cable without first closing the PureJavaComm SerialPort can cause a hang if a read is done on the still open port. It would be nice if the application could be notified when the cable is unplugged and so close the SerialPort, or at least if a read on a SerialPort thats been unplugged would throw an exception. ...ant ________________________________ This e-mail may contain confidential or privileged information. If you are not the intended recipient (or have received this e-mail in error) please notify the sender immediately and destroy this e-mail. Any unauthorized copying, disclosure or distribution of the material in this e-mail is strictly forbidden. We will not be liable for direct, indirect, special or consequential damages arising from alteration of the contents of this message by a third party or as a result of any virus being passed on or as of transmission of this e-mail in general.