[supporto playground]Comunicazioni Java e Arduino

leo, è la libreria per accedere alle porte seriali (e non solo) via java...
come per molte cose, Sun (ora Oracle) ha definito una "specifica" (Java ComAPI) ma non ha rilasciato per tutti i S.O. una vera libreria che implementi tale specifica... ecco rxtx è una implementazione opensource della ComAPI.
http://rxtx.qbang.org/wiki/index.php/FAQ

leo72:
Cmq io uso quella del repo di Ubuntu e sia l'IDE che avrdude da terminale dialogano con l'Arduino senza problemi.

l'ide usa la sua copia interna, credo ignori quella globale (che infatti io non ho installato)

leo72:
Domanda da 'gnurante: a che serve la lib rxtx? A dialogare via Java con l'Arduino?

dunque, è un package java (una serie di classi) che supporta: I2C, PARALLEL, RS485, SERIAL e una non meglio definita RAW

lesto:

leo72:
Cmq io uso quella del repo di Ubuntu e sia l'IDE che avrdude da terminale dialogano con l'Arduino senza problemi.

l'ide usa la sua copia interna, credo ignori quella globale (che infatti io non ho installato)

Ma se io uso avrdude da terminale o un altro software, mi serve oppure no la Rxtx? Penso di no, dovrebbe servire solo alle applicazioni Java, giusto?

no, però l'ide di arduino è java e usa la libreria per il serial monitor

innanzitutto grazie per avermi risposto così velocemente, poi io non ho arduino UNO ma duemilanove, quindi su questa sheild le librerie presenti nei repository di ubuntu vanno bene o mi devo comunque scaricare quelle che trovo qui http://www.cloudhopper.com/opensource/rxtx/ ??(devo usare le librerie del 2008 perchè sono le uniche che sono per la versione 64bit di linux).
in java ho sviluppato un anno fa applicazioni sia da console che a interfaccia grafica, ovviamente anche usando gli oggetti.
se può servire la mia versione di jre e jdk sono

java version "1.6.0_20"
OpenJDK Runtime Environment (IcedTea6 1.9.10) (6b20-1.9.10-0ubuntu1~10.04.3)
OpenJDK 64-Bit Server VM (build 19.0-b09, mixed mode)

Ciao

dovrebbero andare bene, ma la prova è subito fatta... collega arduino, compila ed esegui il semplice programma che ti elenca le seriali disponibili sul PC e scopri se rxtx "vede" la nuova seriale di Arduino:

ho seguito le indicazioni del sito che mi hai riportato ho copiato il sorgente in eclipse

public static String[] listSerialPorts() {
	 
	Enumeration ports = CommPortIdentifier.getPortIdentifiers();
	ArrayList portList = new ArrayList();
	String portArray[] = null;
	while (ports.hasMoreElements()) {
		CommPortIdentifier port = (CommPortIdentifier) ports.nextElement();
	    if (port.getPortType() == CommPortIdentifier.PORT_SERIAL) {
	    	portList.add(port.getName());
	    }
	}
	portArray = (String[]) portList.toArray(new String[0]);
	return portArray;
}

ma mi da 3 errori

public static String[] listSerialPorts()   "Syntax error on tokens, ClassHeader expected instead"
String portArray[] = null;   "Syntax error on token ";", { expected after this token"
} (parentesi di fine programma)   "Syntax error, insert "}" to complete ClassBody"

ciao

quello è solo il metodo per enumerare le porte seriali, naturalmente dovrai costruirci attorno un semplice programmino che te le stampa in console...

il problema è questo che io in java non ho mai usato queste librerie per la comunicazione con l'USB e non saprei come fare, su internet non ho trovato guide.
sennò se al posto del java uso il python con la libreria pyusb o pyserial?? il python mi sembra un linguaggio molto più semplice

sul sito RXTX ci sono un bel pò di esempi funzionanti...

comunque questo più che un problema con la documentazione della libreria, mi pare un problema di conoscenze di java :grin:

Dea1993:
il problema è questo che io in java non ho mai usato queste librerie per la comunicazione con l'USB e non saprei come fare, su internet non ho trovato guide.

ciao

ma qui non si tratta di saper usare o meno le librerie... quello è un semplice metodo statico che devi richiamare da una tua classe java (basta anche dal main): è una cosa semplicissima se hai già scritto codice java (addirittura senza scomodare Swing!)

si lesto anche :sweat_smile: perchè l'ho studiato a scuola ma tra la prof che non sapeva spiegarlo bene (mentre ce lo spiegava molte istruzioni che abbiamo sempre dovuto importare nei programmi non ci ha spiegato a cosa servivano realmente ma ci diceva solo di importarle) e tra me venendo dal C il java non mi è mai piaciuto com linguaggio, inoltre adesso è passato del tempo dall'ultima volta che l'ho usato quindi ora la mia preparazione in java non è un gran che, infatti anche vedendo gli esempi sulle librerie RXTX faccio molta difficoltà a capire cosa fa quel programma.
invecie gia il C o python mi sembrano molto più belli e semplici come linguaggi (praticamente leggere un programma scritto in questi linguaggi è cone leggere l'inglese :slight_smile: ), per questo preferirei visto le mie difficoltà con il java, a programmare in C o python, secondo voi cosa è meglio fare? visto che questo progetto deve essere pronto e funzionante entro aprile (o forse maggio?? :cold_sweat:) per la consegna della tesina, non vorrei che facendolo in java perdessi troppo tempo e per fare alla svelta non viene fuori un copia e incolla.

più che altro lucadentella il problema è che il java non mi è stato spiegato bene a scuola quindi faccio difficoltà a creare un programma da zero, infatti per il motivo che ho detto prima (che molte istruzioni da mettere nel programma non mi è mai stato detto il funzionamento) tutti i programmi che facevo erano quasi un copia e incolla dai programmi vecchi.

ciao

non l'ho provato ma dovrebbe andare...salvalo come ListCom.java

import java.util.ArrayList;
import java.util.Enumeration;
import gnu.io.*;

public class ListCom {

	public static String[] listSerialPorts() {
		 
		Enumeration ports = CommPortIdentifier.getPortIdentifiers();
		ArrayList portList = new ArrayList();
		String portArray[] = null;
		while (ports.hasMoreElements()) {
			CommPortIdentifier port = (CommPortIdentifier) ports.nextElement();
		    if (port.getPortType() == CommPortIdentifier.PORT_SERIAL) {
		    	portList.add(port.getName());
		    }
		}
		portArray = (String[]) portList.toArray(new String[0]);
		return portArray;
	}
	
	public static void main(String[] args) {
	
		for(String name : listSerialPorts())
			System.out.println(name);
	}
}

se hai scadenze da rispettare usa i linguaggi che già conosci, credimi ci risparmi un sacco di tempo

grazie luca per avermi scritto questo programma, però mi da un errore quando importo la classe

import gnu.io.*;   "The import gnu cannot be resolved"

dopo ci sono altri errori ma penso siano dovuti alla mancanza di questa libreria, perchè da errore in tutte le righe in cui è presente

CommPortIdentifier

comunque adesso vede se riesco a far comunicare il PC con arduino usando Java, provo a continuare in java studiandolo di più senò passo a pyserial o pyusb (non so quale sia meglio)

ciao

ma hai configurato Eclipse per utilizzare la libreria rxtx?
http://rxtx.qbang.org/wiki/index.php/Using_RXTX_In_Eclipse

comunque sì, sicuramente prima ti servono delle basi maggiori sul linguaggio che decidi di utilizzare, sia questo Java, C# (vedi tutorial sul mio sito) o Python...

avevo letto su internet che una volta installate le librerie eclipse le caricava in automatico senza bisogno di caricarle manualmente

ho importato il file RXTX.jar in eclipse ora il sorgente lo compila senza errori (solo qualche warning) e nella console mi restituisce

WARNING:  RXTX Version mismatch
	Jar version = RXTX-2.2-20081207 Cloudhopper Build rxtx.cloudhopper.net
	native lib Version = RXTX-2.1-7
/dev/ttyUSB0
Experimental:  JNI_OnLoad called.