Comunicazione su porta seriale/parallela in Java
In questo breve articolo vediamo come comunicare su porte seriali/parallele attraverso un programma Java
Introduzione
La comunicazione su porte seriali/parallele è una di quelle cose che permette ai nostri programmi di comunicare/pilotare hardware collegato al nostro pc. Grazie alle libreria opensource RXTX, che supporta la Comm API della SUN, vedremo come dialogare con le porte di I/O del nostro computer. La prima cosa da notare di questa libreria è che permette di essere utilizzata su sistemi Windows, Linux, MacOSX e Solaris, mentre nella distribuzione ufficiale della SUN possiamo utilizzare soltanto sistemi Solaris SPARC, Solaris x86 e Linux x86.
Libreria RXTX
Questa libreria rispetta la Comm API di SUN, ma ha rinominato diversi suoi componenti inserendoli nel package gnu.io, quindi nel momento in cui dobbiamo passare un programma realizzato con le Comm API di SUN alla libreria RXTX dobbiamo inserire il nuovo package tra gli import. Per “installare” questa libreria dobbiamo:
- Copiare RXTXcomm.jar in jre\lib\ext
- Copiare rxtxSerial.dll e rxtxParallel.dll in jre\bin
Questi file sono disponibile nella distribuzione di RXTX 2.1: http://rxtx.qbang.org/.
Lettura porte
Vediamo prima di tutto un semplice programma che lista le porte disponibili del nostro sistema:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
import gnu.io.*; import java.io.*; import java.util.*; public class TestComm { public static void listPorts() { try{ Enumeration thePorts = gnu.io.CommPortIdentifier.getPortIdentifiers(); while (thePorts.hasMoreElements()) { gnu.io.CommPortIdentifier com = (gnu.io.CommPortIdentifier) thePorts.nextElement(); switch (com.getPortType()) { case gnu.io.CommPortIdentifier.PORT_SERIAL: try { gnu.io.CommPort thePort = com.open("CommUtil", 50); System.out.println("Porta seriale: "+thePort.getName()); thePort.close(); } catch (gnu.io.PortInUseException e) { System.out.println("Porta SERIALE "+com.getName()+", è in uso."); } catch (Exception e) { System.out.println("Failed to open port "+com.getName()+" "+e); } case gnu.io.CommPortIdentifier.PORT_PARALLEL: try { gnu.io.CommPort thePort = com.open("CommUtil", 50); System.out.println("Porta parallela: "+thePort.gerName()); thePort.close(); } catch (gnu.io.PortInUseException e) { System.out.println("Porta "+com.getName()+", è in uso."); } catch (Exception e) { System.out.println("Failed to open port "+com.getName()+" "+e); } } } } catch(Exception ioe){ System.out.println("Errore"); } } public static void main(String[] args){ listPorts(); } } |
Come potete vedere la ricerca delle porte sul sistema è abbastanza semplice. Attraverso la classe gnu.io.CommPortIdentifier viene ottenuta un Enumeration con tutte le porte del sistema. Iterando su tutte le porte, vediamo se è possibile collegarsi ad esse oppure se sono occupate.
Scrittura/Lettura sulle porte seriali/parallele
Ora che sappiamo come collegarci alle porte seriali/parallele del nostro sistema, dobbiamo vedere come possiamo effettuare operazioni di lettura/scrittura. Dobbiamo sapere che alcune porte hanno delle limitazioni/caratteristiche che le contraddistinguono, quindi c’è la necessità talvolta di settare queste informazioni quando utilizziamo una certa porta:
1 2 3 4 5 |
port.setSerialPortParams( 115200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); |
Ora che abbiamo la nostra porta, rappresentata dall’oggetto CommPort, possiamo creare stream di input e di output, nella maniera classica di Java e dialogare con la nostra periferica. Di seguito viene riportata la scrittura/lettura su periferica:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
try { BufferedReader is = null; PrintStream os = null; String temp=null; try { is = new BufferedReader(new InputStreamReader(porta.getInputStream())); temp=is.readLine(); System.out.println("Ho letto dalla periferica: "+temp); } catch (IOException e) { System.err.println("Can't open input stream: write-only"); is = null; } os = new PrintStream(port.getOutputStream(), true); os.print(message); os.flush(); if (is != null) is.close(); if (os != null) os.close(); if (port != null) port.close(); } catch(Exception e) { System.out.println("Errore durante la comunicazione con la porta: "+e); } |
Come in molti casi, dove utilizziamo I/O con Java, dobbiamo utilizzare classi come BufferedReader e PrintStream per gestire i flussi di informazione.
Risorse
Homepage RXTX
Java Communications API
Programmazione seriale in Java
Esiste per caso una libreria che permette di gestire le porte seriali in Android?