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:
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!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(); } } } }
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.

. grazie ancora
Rispondi quotando