Buongiorno a tutti i forumisti. Apro questo topic per chiedere un piccolo aiuto su un programma in Java che sto cercando di sviluppare.

Il mio scopo è un'applicazione Java che permetta la comunicazione tra porte seriali, argomento che ho da poco iniziato a studiare. In pratica, come dovrei fare, una volta aperto il flusso di ingresso, per inviare i dati alla porta? Allego il testo del programma, e preciso che esso gira come da previsioni fino al momento di aprire il flusso di ingresso... poi, si ferma dando una IOException: Stream closed, e dicendo "Operazione non riuscita."

Per quanto credo di aver capito, il problema è che non riesce ad aprire il flusso di comunicazione con la porta COM2, ma non essendo molto pratico di porte seriali, non sono sicuro al 100%...


codice:
import gnu.io.*;
import java.io.*;
import java.util.*;

public class TestPorte
{
  public static void main (String [] args)
  {
    try
    {
       
       System.out.println ("Nome porta specificato."); 

       // Specifica di un nome per la porta che desideriamo.
 
       String portaCercata = "COM1";
       System.out.println ("Enumerazione iniziata."); 

       // enumerazione di tutte le porte che JavaComm conosce.

       Enumeration identificatoriPorte = gnu.io.CommPortIdentifier.getPortIdentifiers();
       System.out.println ("Esaminare ID porte. Individuare porta seriale corrispondente al nome " + portaCercata);    

       // Ogni identificatore di porta viene poi esaminato per vedere se identifica una porta seriale, e se il nome è
       // quello che stiamo cercando.

       CommPortIdentifier idPorta = null;  // verrà settata una volta che sarà stata trovata la porta che vogliamo.
       while (identificatoriPorte.hasMoreElements())
       {
         CommPortIdentifier pid = (CommPortIdentifier) identificatoriPorte.nextElement();
         if (pid.getPortType()==CommPortIdentifier.PORT_SERIAL &&
             pid.getName().equals(portaCercata))
         {
           idPorta = pid;
           System.out.println ("Trovato elemento."); 
           break;
         }
       }

       if (idPorta == null)
       {
         System.err.println ("Porta " + portaCercata + " non trovato.");
         System.exit(1);
       }
    

       // Per acquisire la porta, si usa l'identificatore associato.

       SerialPort porta = null;
       System.out.println ("Tentativo acquisizione della porta.");
       try 
       {
         porta = (SerialPort) idPorta.open("nome", 10000);   // Nome dell'applicazione a cui serve la porta,
                                                             // attesa massima in millisecondi   
       }

       catch (gnu.io.PortInUseException e) 
       {
         System.err.println ("Porta già in uso: " + e);
         System.exit(1);
       }

       System.out.println ("Porta acquisita. Accesso esclusivo.");

       // Ora che la porta è stata acquisita, e abbiamo accesso esclusivo ad essa, possiamo configurarla in
       // modo da ottenere i flussi di ingresso e di uscita. Settare i parametri.

       try
       {
         porta.setSerialPortParams(115200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
       }

       catch (UnsupportedCommOperationException e)
       {
         System.err.println ("Operazione non supportata. " + e);
         System.exit(1);
       }

       // Aprire il lettore dei flussi di ingresso e uscita.

       System.out.println ("Aprire lettore flussi."); 
       BufferedReader ingresso = null;
       PrintStream uscita = null;
       System.out.println ("Preparazione flussi ingresso/uscita.");

       try
       {   
         ingresso = new BufferedReader (new InputStreamReader(porta.getInputStream()));
       }

       catch (IOException e)
       {
         System.err.println ("Apertura flusso di input impossibile: sola scrittura.");
         ingresso = null;    
       }

       System.out.println ("Aperto flusso ingresso.");

       uscita = new PrintStream(porta.getOutputStream(), true);

       // La comunicazione vera e propria dei dati avviene a questo punto. Bisogna poi chiudere nuovamente
       // i flussi di ingresso-uscita in modo che le risorse possano in seguito essere assegnate di nuovo.  

       if (ingresso != null) ingresso.close();
       if (uscita != null) uscita.close();
       if (porta != null) porta.close();
     
       // Scrittura in uscita 
       
       uscita.print("AT");
       uscita.print("\r\n"); // Line feed

       ingresso.readLine(); // La prima lettura contiene il comando di eco "AT".
       ingresso.readLine(); // La seconda rimuove il line feed che AT genera come output.

       // Lettura di dati

       String risposta = ingresso.readLine(); // se è stato inviando "AT", risposta è "OK"

    }  
    
    catch (Exception e)
    {
      System.err.println ("Operazione non riuscita. " + e);
    }
  }
}

Ringrazio fin d'ora per l'aiuto, e spero di non aver disturbato.