The following appears to work for Ken Eisner <019769e@acadiau.ca> ----- under a windows platform we can check for lost of DSR and it is consistant however, under linux it is not consistant. We rarely and infrequently get loss of DSR. ----- We found a way around the inconsistant detection / loss of DSR. We decided to check the DSR status in the OUTPUT_BUFFER_EMPTY event (I think that is where we put it). ----- Trent, here is the code which works for us. Excuse the formating.. damned thing won't space things properly... Let me know if you need anything else -Ken /** * Procedure: void serialEvent(SerialPortEvent event) * Params: SerialPortEvent event * * Define what we are doing when one of these events are fired **/ public void serialEvent(SerialPortEvent event) { int numBytes = 0; int offset = 0; switch(event.getEventType()) { case SerialPortEvent.BI: case SerialPortEvent.OE: case SerialPortEvent.FE: case SerialPortEvent.PE: case SerialPortEvent.CD: case SerialPortEvent.RI: case SerialPortEvent.CTS: break; case SerialPortEvent.DSR: break; case SerialPortEvent.OUTPUT_BUFFER_EMPTY: /* * HACK: This is designed to work around the inconsistent loss of DSR * and inconsistent detection of DSR if program running before * cable connected * * Here we check if the DSR flag is high. * If it is then we check to see if our class var is alread true, * meaning that we have a connection. * If our class var got_dsr is false then we set our class var * got_dsr to true, lost_dsr to false * Else the we already have a connection so just set the class var * got_dsr to true * Else we check if we already have DSR * If we do then we set the lost_dsr to true, and got_dsr to false * meaning that we lost DSR */ if (serial_port_.isDSR() == true) { if (got_dsr == false) /* new connection */ { got_dsr = true; System.out.println("\nReceived DSR -- BEGIN OF TRANSMISSION\n"); lost_dsr = false; } else /* old connection */ got_dsr = true; } else { /* already got connection */ if (got_dsr == true) { /* * Check if we have a bad call * * 1.) Get the current time (in milliseconds) * 2.) If the current time is less than the time of the last * character read then we have major problems * 3.) Otherwise, if the current time less the time of the last * char read is less than the length of the end tone then we * have a bad call. */ Date now = new Date(); long current_time = now.getTime(); if (current_time <= time_of_last_char) System.err.println("CommReader() - Current time is before last char"); else { if ((current_time - time_of_last_char) <= end_tone_length_) { System.out.println("\nInterrupted transmission"); this.passed_client_checks_ = false; } else { System.out.println("\nGood transmission"); this.passed_client_checks_ = true; } } /* * Stick a fork in us, we're done here. */ sender_.close_zipfile(); /* * Set lost_dsr to true and got_dsr to false * Set finished_receiving_data to true */ lost_dsr = true; System.out.println("Lost DSR -- END OF TRANSMISSION"); got_dsr = false; this.finished_receiving_data_ = true; } } break; case SerialPortEvent.DATA_AVAILABLE: byte[] readBuffer = new byte[2048]; try { /* * Read while there is something to read, stop when done */ while (is_.available() > 0) { offset = 0; numBytes = is_.read(readBuffer); Date now = new Date(); time_of_last_char = now.getTime(); if (numBytes > 0) { /* * The first character detected is some weird ^@ thing which we * want to ignore so we set the offset to 1 and reduce the * numBytes read by one */ if (readBuffer[0] == 0) { offset = 1; numBytes--; } System.out.print(new String (readBuffer , offset, numBytes)); sender_.write(readBuffer, offset, numBytes); } } } catch (Exception e) { System.err.println(e.getMessage()); e.printStackTrace(); } break; } /* end switch */ }