Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it L'avatar di jeky84
    Registrato dal
    Sep 2009
    Messaggi
    43

    RXTX----Errore EventListener

    Salve a tutti stò creando un programma in java per comunicare tramite la porta seriale con un pci e mi sono trovato davanti a un bel problema:
    quando faccio partire lo scrittore esso scrive, chiama la classe che fà partire il lettore che legge da seriale e poi ritorno a poter scrivere( con un semplice ciclo do while);
    il problema è questo:
    quando invio dati la prima volta funziona tutto, lui mi risp e il comando torna di nuovo a me per poter scrivere altri comandi. il problema è che al secondo ciclo esso si blocca dandomi un' Eccezione di tipo TooManyListenersException...questo perchè nel ciclo while ogni volta faccio un addEventListener che poi non riesco a cancellare e quindi siccome lui non può gestire più di un eventlistener mi dà errore
    come faccio a cancellare ogni volta il listener che poi tanto viene ricreato a ogni ciclo while??
    sono a conoscenza del metodo removeeventlistener ma non funziona oppure non capisco io come usarlo!!
    mi scuso se ho fatto errori e ringrazio tutti per l'aiuto
    Saluti

  2. #2
    Utente di HTML.it L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568
    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
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

  3. #3
    Utente di HTML.it L'avatar di jeky84
    Registrato dal
    Sep 2009
    Messaggi
    43
    grazie mille per la risposta rapida!
    però io già ho fatto come dici...cioè già ho una classe apposita per il listener...
    il problema è che poi una volta scritto il comando e letto la risposta per la prima volta...la seconda volta lui torna sul programma principale e riapre un altro listener...con conseguente eccezione...ho provato con removeeventlistener ma non funziona forse lo uso male...

  4. #4
    Utente di HTML.it L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568
    non deve.. sul programma principale deve fare solo quello che ti ho messo nei tag code..
    non deve più passare di li.. probabilmente hai messi il ciclo di ascolto sulle porte per trovare la com su cui hai collegato il modem.. ti mancherà un break; credo..
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

  5. #5
    Utente di HTML.it L'avatar di jeky84
    Registrato dal
    Sep 2009
    Messaggi
    43
    si ma cmq se io voglio scrivere al modem e avere una risposta, poi farlo ancora...e ancora e ancora...devo per forza ogni volta scrivere, aprire l'eventlistener , leggere e richiuderlo...e poi aprirne un altro...o no???...mmm misà che mi manca qualche cosa a livello di ragionamento! senti ma se ti mando il mio codice e gli dai uno sguardo??( via mail intendo)

  6. #6
    Utente di HTML.it L'avatar di jeky84
    Registrato dal
    Sep 2009
    Messaggi
    43
    emmm...come non detto...risolto...avevo messo l'addeventlistener dentro al while senza rendermi conto dell'errore( menomale che nel tuo mess hai parlato di ciclo ihihihihih)
    grazie mille morhy sei un grande!!!
    spero che mi risponderai sempre te quando avrò bisogno di aiuto...( cioè tra 5 min credo ) ciao e ancora grazie

  7. #7
    Utente di HTML.it L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568
    lavoro tutti i giorni, quindi una visitina la faccio sempre
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

  8. #8
    Utente di HTML.it L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568
    Originariamente inviato da jeky84
    si ma cmq se io voglio scrivere al modem e avere una risposta, poi farlo ancora...e ancora e ancora...devo per forza ogni volta scrivere, aprire l'eventlistener , leggere e richiuderlo...e poi aprirne un altro...o no???...mmm misà che mi manca qualche cosa a livello di ragionamento! senti ma se ti mando il mio codice e gli dai uno sguardo??( via mail intendo)
    a livello di ragionamento no.. l'event listener apre un thread che non muore mai..
    è quel thread che rimane in asolto sulla com..
    l'unico modo di fermarlo è killare l'intero processo

    questa difatti è l'unica pecca che non son riuscito a risolvere (e anche parecchi altri sul sito della sun), non riesco proprio a chiudere la comunicazione con il comando close()..
    se lo fai ti si blocca tutto, non da ne errori ne segni di vita..

    finchè il processo è attivo una volta aggiunto l'event listener non c'è modo di fare la close..
    la porta rimane bloccata in ascolto su quel modem.. puoi chidere le connessioni e resettare il modem, ma chiudere la porta e riaprirla con un nuovo listener non ci sono proprio riuscito e le ho provate in tutti i modi..

    sempre da forum sun alcuni hanno parlato di un bug..
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

  9. #9
    Utente di HTML.it L'avatar di jeky84
    Registrato dal
    Sep 2009
    Messaggi
    43
    scusa morphy79...ma allora ti chiedo un'altra cosa...sarebbe possibile prendere un eventlistener e associarlo ad un altro evento senza rimuoverlo( che tanto è impossibile)????cioè...io ho un listener in ascolto su quella porta che richiama un certo metodo...dopo che il suo lavoro è fatto dovrei richiamare un altro metodo coin un altro eventlistener...siccome l'eventlistener è sempre del dipo dataavailable potrei in qualche modo prendere l'event listener creato prima e asscoiaro al mio nuovo metodo??
    spero sia chiaro....ihihihih
    grazie mille

  10. #10
    Utente di HTML.it L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568
    Originariamente inviato da jeky84
    scusa morphy79...ma allora ti chiedo un'altra cosa...sarebbe possibile prendere un eventlistener e associarlo ad un altro evento senza rimuoverlo( che tanto è impossibile)????cioè...io ho un listener in ascolto su quella porta che richiama un certo metodo...dopo che il suo lavoro è fatto dovrei richiamare un altro metodo coin un altro eventlistener...siccome l'eventlistener è sempre del dipo dataavailable potrei in qualche modo prendere l'event listener creato prima e asscoiaro al mio nuovo metodo??
    spero sia chiaro....ihihihih
    grazie mille
    si è chiaro ma temo di no.. non puoi aggiungere ascoltatori se prima non rimuovi quello assegnato..
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.