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.