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 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 ), 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?? ) 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.
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)
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...
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.
comunque per la programmazione di arduino non ho roblemi, sono 3 giorni che lo sto programmando tutto il giorno staccando solo per mangiare e dormire e devo dire che è molto semplice e divertente usarlo, adesso ridarò una spolverata a java e cercherò di capire come funzionano queste librerie RXTX
intanto grazie a tutti per il supporto che mi avete dato
ho fatto un programma che accende un LED se viene digitato 1 e lo spegne se si digita 0 altrimenti se si digita un'altro carattere dice comando errato, i comandi li passo ad arduino tramite il serial monitor della IDE di arduino per ora.
il programma funziona, nel senso che se do 1 si accende e se do 0 si spegne però guardando nel serain monitor ad esempio premo 1 mi dice:
LED acceso
comando errato
comando errato
e lo stesso se premo 0 (solo al posto di darmi LED acceso dice LED spento)
questo è il sorgente del programma
#define LED 13 // led connesso al pin 13
int cmd = 0; // variabile per contenere il carattere ricevuto
void setup() {
Serial.begin(9600); // imposto la UART per lavorare a 9600
pinMode(LED, OUTPUT); // imposto il pin sul quale è collegato il led come uscita
Serial.flush(); // svuoto il buffer di ricezione seriale
}
void loop() {
// Controllo se il buffer di ricezione contiene qualcosa
if (Serial.available() > 0) {
cmd = Serial.read(); // leggo il carattere ricevuto e lo memorizzo in rx
Serial.flush(); // svuoto il buffer di ricezione seriale
// se il comando è 0
if (cmd == '0') {
Serial.print(cmd); //stampo il valore di cmd
// controlloa se il LED era acceso
if (digitalRead(LED) == HIGH) {
digitalWrite(LED, LOW); // spengo il LED
Serial.println("LED spento"); // scrivo nella seriale "LED Spento"
}
// se il led era spento
else
Serial.println("Il LED e' gia spento, forse volevi accenderlo?? premi <1> per accendere il LED");
}
//se il comando è 1
if (cmd == '1') {
Serial.print(cmd); //stampo il valore di cmd
//controllo se il LED era spento
if (digitalRead(LED) == LOW) {
digitalWrite(LED, HIGH); //accendo il LED
Serial.println("LED acceso"); //scrivo nella seriale "LED acceso"
}
else
Serial.println("Il LED e' gia acceso, forse volevi spegnerlo?? premi <0> per spegnere il LED");
}
//se il comando non è ne 0 ne 1
else {
Serial.print(cmd);
Serial.println("Comando errato! premere <1> per accendere il LED e <0> per spegnerlo");
}
}
}
questo è quello che restituisce nel serial monitor
49LED acceso
13Comando errato! premere <1> per accendere il LED e <0> per spegnerlo
10Comando errato! premere <1> per accendere il LED e <0> per spegnerlo
49Il LED e' gia acceso, forse volevi spegnerlo?? premi <0> per spegnere il LED
13Comando errato! premere <1> per accendere il LED e <0> per spegnerlo
10Comando errato! premere <1> per accendere il LED e <0> per spegnerlo
48LED spento
48Comando errato! premere <1> per accendere il LED e <0> per spegnerlo
13Comando errato! premere <1> per accendere il LED e <0> per spegnerlo
10Comando errato! premere <1> per accendere il LED e <0> per spegnerlo
guardando nella tabella del codice ASCII il 13 corrisponde a "carriage return" e il 10 a "linee feed"
una domanda cosa cambia se lavoro con UART a 9600, 4800 o ad un altro valore??
il baud rate è il numero di caratteri al secondo che possono essere inviati via seriale.
per quanto rigurda i caratteri \n\r (carriage return e line feed) sono i mormali caratteri che windows genera che vogliono dire "premuto tasto invio", nel serial monitor c'è una checkbox per disabilitare l'invio di questi caratteri.
sisi adesso funziona bastava mettere "no line editing" al posto di "both NL & CR", comunque ho dovuto fare anche una piccola modifica al sorgente perchè, cioè al posto dell'ultimo else mettere
if ((cmd != '0')&&(cmd != '1'))
perchè senò premendo 0 non non mi entrava nell'if con condizione cmd==1 e quindi entrava nell'ultimo else dicendomi carattere errato
giusto hai ragione lo switch è la cosa migliore, va be comunque in questo programma non mi interessava tanto l'ottimizzazione del programma ma più che altro era un esercitazione per prendere confidenza con la comunicazione seriale
in rete ho trovato dopo una lunga ricerca queste due guide secondo me fatte molto bene per iniziare a programmare in java usando le librerie RXTX, le metto qua in caso a qualcuno potessero essere utili http://www.electroyou.it/tardofreak/wiki/pc-e-linee-seriali in italiano How to open serial port (using rxtx) | Embedded Freaks.. in inglese
adesso inizierò a studiarmele per bene e poi spero di riuscire (in settimana) ad accendere un LED da PC usando un software creato da me in java