ho appena finito un programma sulla seriale, sei fortunato 
allora tu devi mettere un solo listener..
questo rimane in ascolto sempre..
al listener assegni una classe apposta che si occupa di ricevere e inviare dati..
ora passiamo al codice
per la classe 1 ( diciamo quella che prepara la comunicazione )
ti serve più o meno questo pezzo di codice (non posso postartelo tutto se no dall'alto mi uccidono)
codice:
SerialPort serialPort = (SerialPort)commPort;
InputStream is = serialPort.getInputStream();
OutputStream os = serialPort.getOutputStream();
EventManager eventManager = new EventManager( is, os);
// setto alcuni parametri
this.setPortParameterAndFlowControlMode(serialPort);
// preparo notify listener dati
serialPort.notifyOnDataAvailable(true);
// avvio listener sulla porta
serialPort.addEventListener(eventManager);
come puoi notare ho solo aperto la comunicazione sulla seriale..
è l'eventManager che si occuperà del resto ogni volta che gli viene notificato qualcosa
codice:
public class EventManager extends BaseModem implements SerialPortEventListener
{
public ModemEventManager(InputStream is, OutputStream os)
{
super();
this.inputStream= is;
this.outputStream= os;
}
// GESTIONE MESSAGGI SULLA PORTA
public void serialEvent(SerialPortEvent event)
{
switch (event.getEventType())
{
case SerialPortEvent.DATA_AVAILABLE: // 1 Data available
try
{
// leggo il dato in ingresso
String readValue = modemUtil.read(inputStream);
}
catch (DataAccessException e)
{
strErrs = e.getMessage();
}
catch (Exception e)
{
strErrs = e.getMessage();
}
break;
case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 2 Output buffer is empty
break;
case SerialPortEvent.CTS: // 3 Clear to send
case SerialPortEvent.DSR: // 4 Data set ready
case SerialPortEvent.RI: // 5 Ring indicator
case SerialPortEvent.CD: // 6 Carrier detect
case SerialPortEvent.OE: // 7 Overrun error
case SerialPortEvent.PE: // 8 Parity error
case SerialPortEvent.FE: // 9 Framing error
case SerialPortEvent.BI: // 10 Break interrupt
}
spero ti sia più chiaro.. bye