Buonasera a tutti, premetto che è da una settimana che ho cominciato a leggermi tutto il materiale disponibile sul protocollo seriale e quindi per il momento non sono molto pratico della gestione della comunicazione. Sto creando una semplice applicazione Java che legga da porta seriale dei dati che devono poi essere interpretati dal programma stesso. L'applicazione è strutturata per sfruttare il multithreading pertanto la mia idea sarebbe quella di avere un thread che in ciclo infinito si incarica di leggere i dati e un altro thread che a comando dell'utente invii alla porta altrettante informazioni. Ora il problema si verifica per quanto riguarda il thread "ricevitore", e più precisamente nella readLine della BufferedReader, perchè inspiegabilmente mi va in eccezione e non ne capisco il motivo. Vi lascio il codice per capire meglio:

codice:
public class Ricevitore extends Thread {
    
    Enumeration listaPorte; //la lista delle porte da acquisire
    SerialPort miaPorta; //la COM1
    String messLetto; //il messaggio da leggere

    public Ricevitore(String porta) {
       try{
            listaPorte = gnu.io.CommPortIdentifier.getPortIdentifiers(); //fatti dare la lista
            gnu.io.CommPortIdentifier com = (gnu.io.CommPortIdentifier) listaPorte.nextElement(); //prendi la COM1
            try {
                miaPorta = (SerialPort) com.open(porta, 50); //prova ad aprirla
                miaPorta.setSerialPortParams(9600, //setta i parametri di comunicazione
                                            SerialPort.DATABITS_8,
                                            SerialPort.STOPBITS_1,
                                            SerialPort.PARITY_NONE);
            } catch (PortInUseException ex) {
                ex.printStackTrace();
            } catch (UnsupportedCommOperationException ex) {
                ex.printStackTrace();
            }
        }catch(Exception e){
            e.printStackTrace();        }
    }
    @Override
    public void run() {
        System.out.println("Tentativo di lettura dati...");
        while (true) { //ciclo di lettura infinito
            try {
                    BufferedReader br = new BufferedReader(new InputStreamReader(miaPorta.getInputStream())); //crea buffer di lettura
                    System.out.println("Lettura in corso...");
                    messLetto = (String)br.readLine(); //leggi dalla porta il messaggio e assegnalo alla stringa. E' QUESTA L'ISTRUZIONE CHE GENERA LA I/O EXCEPTION 
                    System.out.println("Lettura dati completata dalla periferica: " + miaPorta.getName());
                    System.out.println("Dati letti: +\n" + messLetto);
                    Thread.sleep(1000);
            } catch (IOException e) {
                System.err.println("Can't open input stream: write-only");
                e.printStackTrace();
            }catch(InterruptedException ex){
                ex.printStackTrace();
            }finally{
                miaPorta.close();
            }
    }

    }
}
In quel punto lì va in eccezione e si pianta tutto. Ho provato ad inserire un if(br.ready()) allora fai la lettura, e funziona senza piantarsi..ma perchè non è mai pronto e nell if non entra mai!
A questo punto le mie domande sono:
1) se non riceve dati la readline va in eccezione o semplicemente dovrebbe continuare a girare non assegnando niente come mi servirebbe?
2) per gestire un byte da inviare è meglio usare un altro oggetto invece della BufferedReader?
3) leggendo quà e là ho notato che le InputStream sono monodirezionali, che quindi per avere due canali devo avere due oggetti, nel mio caso mi sembra di rispettare la condizione, si riconosce qualche errore che contraddica quanto detto nel mio codice?
4) la lista delle porte che trovo su ogni pc con cui ho provato è la stessa, e suppongo che siano porte virtuali quindi, ma se io comunico un flusso alla porta "virtuale" COM1 il programma poi la manda veramente a quella reale se è presente sulla scheda madre?
5) se si risolvesse tutto, potrei con i due thread comunicare sulla seriale in contemporanea, o per scrivere dovrei fermare il thread di lettura?

Ringrazio anticipatamente tutti coloro che mi daranno attenzione, e mi scuso se ho commesso nel codice qualche castroneria informatica, ma dopo tre notti che vado avanti a caffè su questo programma sto cominciando ad impazzire . grazie ancora

PS: un informazione che potrebbe essere utile, sto usando solo la libreria RXTX e non la javax.comm perchè ,mi sembra di aver letto che con windows non funziona. E nel codice gli import sono già inseriti ma omessi.