Comunicazione seriale Istallazione della libreria ed utilizzo Ci sto lavorando
Oggetto: Istalazione della libreria jssc e importazione
Questo è un argomento molto importante in quanto permette la comunicazione del PC con il mondo esterno ed in particolare con Arduino un microcontrollore che fa miracoli. Esso è in grado di interfacciasi con un'infinità di sensori consentendo l'accesso ad un'infinità di applicazioni. La comunicazione seriale avviene attraverso la vecchia porta seriale RS- 232 ormai sostituita dalla più performante USB. Comunicare con Arduino è l'obiettivo principale di queste pagine. Vogliamo farlo mediante l'uso del linguaggio java, per questo bisogna scaricare delle apposite librerie. Se ne trovano alcune in rete, una è la RxTx abbasta complessa da gestire e, sembra non più supportata, quindi dopo alcuni tentativi ho preferito cercare qualcosa di più accessibile e credo di averlo trovato in una libreria il cui nome è esplicativo JSSC acronimo di "Java Simple Serial Connector" scritta dal russo Alexey Sokolov alias scream3r.
Istallazione: Il materiale scaricato consta di: JSSC-2.8.0.jar - è la vera e propria libreria, ossia la collezione di classi compilate (bycode) tipo file.class. JSSC-2.80-javadoc.jar - è il reference. Qui il jar ha funzione di file zip. Se vogliamo averlo a disposizione in locale possiamo scompattare il file jar con winzip ed inserire il tutto in una direttory sul pc bastera eseguire l'index.html. Se si vuole risparmiare spazio c'è chi lo ha messo online per noi lo troviamo nei link della documentazione (qui sopra) alla voce JSSC Reference. JSSC-2.8.0-sources.jar - ci sono i sorgenti i file.java delle 7 classi che compongono la libreria.
A questo punto dobbiamo aggiungere la libreria (JSSC-2.8.0.jar) nel posto giusto e questo è: C:\Program Files\Java\jre1.8.0_151\lib\ext. Copiamola in questa posizione. Per utilizzare la libreria nei nostri progetti dobbiamo aggiungerla al progetto e poi importarla. Per comprendere la procedura mi baserò sul progetto ArduinoRGB.
Creiamo il progetto ed importiamo la libreria JSSC-2.8.0.jar così:
Clicchiamo su Add JAR/Folder... e andiamo a pescarla dove l'abbiamo messa ossia in: C:\Program Files\Java\jre1.8.0_151\lib\ext.
Dobbiamo infine importarlo, in modo dettagliato o semplicemente con l'omnicomprensivo: import jssc.*;
Le parti del codice che interessano la comunicazione seriale sono nel metodo serialInitialize() (righe 249-269) e serialPortReader() (righe 270-302).
Iniziamo con l'analizzare serialInitialize()
Vediamo cosa accade. Si crea un'istanza della classe serialPort fornendo al costruttore la porta, la COM3 nel nostro caso. C'e anche il modo di fargli rilevare la lista delle com disponibili ma poichè nel mio PC Arduino si collega mediante la COM3 sono andato diretto. Una volta creato l'oggetto porta seriale bisogna aprirla. Questo provoca una singolare reazione da parte di Arduino il quale in seguito alla apertura della porta si resetta. Una volta aperta bisogna impostarla. Il metodo setParams riceve 4 argomenti che sono
La pausa di 2 secondi Thread.sleep(2000); servirà a dare il tempo ad Arduino di resettarsi. Ora parliamo un attimo di mask. Faccio una premessa molto sintetica (per un approfondimento si veda la documentazione 1° link) nella trasmissione seriale RS 232 ci sono 9 pin (9 cavi) due servono per la trasmissione dei dat uno TX da PC a Arduini e RX da arduino a PC poi ce ne sono altri che servono ai dispositivi per passarsi informazioni di altro tipo per esempio sul RTS il PC dice ad Ar. sei pronto che ti devo inviare dei dati e Ar. se prondo gli risponde sul CTS si ok sono pronto invia pure. Invece il PC avverte Ar di essere pronto a ricevere dati sul DTR ed Ar gli risponde che è pronto adf inviargleli sul DSR. Quindi se parliamo di ricezione avremo i dati su RX ed i messaggi su CTS e DSR. Ora sinceramente di quello che si dicono fra loro il PC con Ar a noi non ci interessa la cosa che invece ci interessa sono i dati in arrivo parliamo di serialPortReader() lettura. La maschera serve a filtrare fa passare solo i dati che ci interessano. Nella maschera, dobbiamo specificare i tipi di eventi che vogliamo monitorare. Se per esempio, ci interessa sapere solo se ci sono dati in arrivo la maschera deve avere il valore seguente: MASK_RXCHAR. Se, per esempio, abbiamo bisogno di sapere anche dei cambiamenti negli stati delle linee CTS e DSR, la maschera deve apparire così: SerialPort.MASK_RXCHAR + SerialPort.MASK_CTS + SerialPort.MASK_DSR. Ma poiche a noi interessano solo i dati in arrivo useremo int mask = SerialPort.MASK_RXCHAR; Nella righa 252 andiamo ad associare un ascoltatore (l'oggetto SerialPortReader) alla serialPort . L'ascoltatore è un oggetto che implementa un'interfaccia di tipo serialPoreEventListener e quindi sarà costretto a definire il metodo serialEvent all'interno del quale andremo a fargli fare quello che vogliamo quando si scatena l'evento, ossia quando arriva qualche dato. Ad esempio leggerlo. Naturalmete il tutto deve stare all'interno di un blocco try ... catch in quanto si potrebbe verificare una eccezione del tipo SerialPortException. Notare che viene eventualmente catturato anche l'eccezione InterruptedException necessaria per Thread.sleep(2000);
Ora passiamo a discutere la classe interna SerialPortReader
Questa è la parte che si fa carico di rimanere in acolto da eventuale invio di dati da parte di Arduino. SerialPortReader è l'ascoltatore ossia la classe che starà in ascolto e che verrà asociata al source cFrame (vedi linea 252 nel metodo serialInitialize()). Nel momento che verrà lanciato un evento, ogni volta che avremo dati in arrivo dalla seriale, verrà eseguito il metodo serialEvent(). Vediamo cosa fa questo metodo:
I vari cicli try catch sono necessari per intercettare le varie eccezioni che si possono verificare e che farebbero terminare il programma
Questo è riferito al progetto ArduinoRGB per approfondimenti vedi qui.
|