Salve,
Sto cercando di far comunicare Arduino con un programma in java. Per fare questo sto usando la libreria JSSC. In Arduino ho scritto un semplice sketc che invia sulla porta seriale i valori generati da un potenziometro su una porta analogica, diciamo che invia valori compresi tra 0 e 255. Dall'altra parte il programma in java deve ascoltare l'invio di questi dati e visualizzarli a monitor. Bene e la cosa funziona, ma quando vado a trasformare questi valori (0-255) in valori che esprimono i volt (0-5V) mediante un metodo di conversione da me scritto (pubblic String toVolt(String str)) e che ho testato e funziona perfettamente, dopo un po il programma termina con il seguente errore:
Exception in thread "EventThread COM3" java.lang.NumberFormatException: empty String
at sun.misc.FloatingDecimal.readJavaFormatString(Floa tingDecimal.java:1842)
at sun.misc.FloatingDecimal.parseDouble(FloatingDecim al.java:110)
at java.lang.Double.parseDouble(Double.java:538)
at rserial.Rserial.toVolt(Rserial.java:61)
at rserial.Rserial.access$000(Rserial.java:8)
at rserial.Rserial$SerialPortReader.serialEvent(Rseri al.java:25)
at jssc.SerialPort$EventThread.run(SerialPort.java:11 12)
Per tamponare la situazione ho filtrato cos� (dove str � la stringa in arrivo sulla COM):
if(str!=null && !str.isEmpty()){
str=toVolt(str);
System.out.println(str);
}
Ma non ne vuole sapere, gira per un po, mi da diversi valori in volt poi ad un certo punto va in crash e mi da l'errore. Ora come � possibile che possa passare una stringa vuota se l'if la dovrebbe bloccare?
Vi allego il codice:
Java
import jssc.SerialPort;
import jssc.SerialPortEvent;
import jssc.SerialPortEventListener;
import jssc.SerialPortException;
public class Rserial {
SerialPort serialPort;
public Rserial(){
serialInitialize();
}
public static void main(String[] args) {
Rserial rs = new Rserial();
}
public class SerialPortReader implements SerialPortEventListener {
public void serialEvent(SerialPortEvent event) {
try {
String str = serialPort.readString();
//if(str!=null && !(str.compareTo("")==0)){
if(str!=null && !str.isEmpty()){
str=toVolt(str);
System.out.println(str);
}
}catch (SerialPortException ex) {
System.out.println(ex);
}
}
}
public void serialInitialize() {
try {
serialPort = new SerialPort("COM3");
// apri la porta seriale
System.out.println("Port opened: " + serialPort.openPort());
// imposta i parametri della porta
System.out.println("Params setted: " + serialPort.setParams(115200, 8, 1, 0));
Thread.sleep(2000);//Dai tempo ad arduino di resettarsi
//Aggiungi un'interfaccia attraverso la quale riceveremo informazioni sugli eventi
serialPort.addEventListener(new SerialPortReader());
System.out.println("La porta �: " + serialPort.getPortName());
System.out.println("PRONTO");
} catch (SerialPortException | InterruptedException ex){
System.out.println(ex);
}
}
private String toVolt(String str){
double dbt,dbr;
if(str.length()>3) str=str.substring(0, 2);
dbt = Double.parseDouble(str);//da stringa a double
dbr=(dbt*5)/255;
dbr=roundD(dbr,2.0);
String ris=Double.toString(dbr);
return(ris);
}
private double roundD(double dap,double cfr){
double dv = Math.pow(10,cfr);
double n=Math.round(dap*dv);
double res = n/dv;
return(res);
}
}
Arduino
int ledPin = 9;
int potPin = A0;
int valPot, numPot;
int memPot;
void setup(){
Serial.begin(115200);
pinMode(ledPin, OUTPUT);
pinMode(potPin, INPUT);
}
void loop(){
valPot=analogRead(potPin);
numPot = map(valPot,0,1023,0,255);
if ((numPot < memPot-1 || numPot > memPot+1)){//se lo muovi
memPot=numPot;
analogWrite(ledPin,numPot);
Serial.println(numPot);
}
}
Sto impazzendo non riesco a capire il perch�.
Se mi date una mano ne sarei grato.
Grazie