Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    1

    [Java] Problema lettura porta seriale InputStream/BufferedReader

    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.

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Moderazione

    Ho spostato la dicussione nel forum dedicato a Java.
    Inoltre, il codice va postato all'interno dei tag CODE, non dei tag QUOTE (sistemato anche questo).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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.