Ho un programma in Java in cui devo leggere le informazioni che un Arduino sta inviando. Ho preso il codice Java da here. Ora, non ho ben capito come funziona, ma ho cercato di modificarla e ho ottenuto questo:Java/Arduino - Lettura dati dalla porta seriale
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.util.Enumeration;
public class Serial implements SerialPortEventListener {
SerialPort serialPort;
private static final String PORT_NAMES[] = {
"/dev/tty.usbserial-A9007UX1", // Mac OS X
"/dev/ttyUSB0", // Linux
"COM3", // Windows
};
private BufferedReader input;
private static OutputStream output;
private static final int TIME_OUT = 2000;
private static final int DATA_RATE = 115200;
public void initialize() {
CommPortIdentifier portId = null;
Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();
while (portEnum.hasMoreElements()) {
CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();
for (String portName : PORT_NAMES) {
if (currPortId.getName().equals(portName)) {
portId = currPortId;
break;
}
}
}
if (portId == null) {
System.out.println("Could not find COM port.");
return;
}
try {
serialPort = (SerialPort) portId.open(this.getClass().getName(),TIME_OUT);
serialPort.setSerialPortParams(DATA_RATE, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
input = new BufferedReader(new InputStreamReader(serialPort.getInputStream()));
output = serialPort.getOutputStream();
serialPort.addEventListener(this);
serialPort.notifyOnDataAvailable(true);
}
catch (Exception e) {
System.err.println(e.toString());
}
}
public synchronized void serialEvent(SerialPortEvent oEvent) {
if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
try {
String inputLine=input.readLine();
System.out.println(inputLine);
} catch (Exception e) {
System.err.println(e.toString());
}
}
}
public synchronized void close() {
if (serialPort != null) {
serialPort.removeEventListener();
serialPort.close();
}
}
public Serial(String ncom){
if(Integer.parseInt(ncom)>=3 && Integer.parseInt(ncom)<=9)
PORT_NAMES[2] = "COM" + ncom;
initialize();
Thread t=new Thread() {
public void run() {
try {Thread.sleep(1000000);} catch (InterruptedException ie) {}
}
};
t.start();
System.out.println("Serial Comms Started");
}
public synchronized void send(int b){
try{
output.write(b);
}
catch (Exception e) {
System.err.println(e.toString());
}
}
public synchronized int read(){
int b = 0;
try{
b = (int)input.read();
}
catch (Exception e) {
System.err.println(e.toString());
}
return b;
}
}
creo Serial oggetto con il COM port ho bisogno nel programma principale, allora io uso Serial.read
e Serial.write
quando ne ho bisogno.
Serial.write
funziona benissimo, Arduino riceve i dati e li mostra in un display LCD. Il problema è Serial.read
. Quando il programma è in esecuzione, continua a leggere dalla porta seriale (circa ogni 40 ms), ma ciò non significa che Arduino abbia inviato qualcosa. Arduino invia un byte solo quando viene premuto un pulsante. Quindi, quando il codice Java è in esecuzione, lancia "n" Exception prima di leggere qualcosa, e questo cousera così tanto ritardo.
So che ho bisogno di qualcosa come Serial.available()
, ho provato input.available()
, ma non funziona. Non so come risolvere questo problema.
Se hai un codice funzionante, sarei molto grato se me lo potessi dare. Ho solo bisogno di due metodi, leggere e scrivere, non mi interessa come funziona il codice: D
EDIT:
ho cambiato la classe seriale, ora ha di nuovo questo metodo come detto apremalal
public synchronized void serialEvent(SerialPortEvent oEvent) {
if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
try {
String inputLine=null;
if (input.ready()) {
inputLine = input.readLine();
panel.read(inputLine);
}
} catch (Exception e) {
System.err.println(e.toString());
}
}
}
e l'altra classe (Pannello in questo caso) ho questo:
public void read(String data){
System.out.println(data);
System.out.println(data == "255");
if(data == "255")
//code here
}
stampa correttamente i valori, ma data == "255"
è sempre false, anche se davvero ottenere un 255 012.351..... Ho provato a fare Integer.parseInt
ma non è cambiato nulla. Perché diavolo?
EDIT 2: Ok risolto: \
public void read(String data){
serialRead = Integer.parseInt(data);
if(serialRead == 255)
//code here
}
Ora è work..don't so perché ho dovuto fare questo ... meh qualunque :)
Sì..questo è il codice java di esempio da Arduino playground ... –
Ho modificato il metodo serialEvent per evitare il problema che hai menzionato – Anuruddha
sì ma questo codice stampa il dati sulla console. Quello di cui ho bisogno è, da un'altra classe (come la mia Main.java), ottenere i dati e usarli. Come "if (Serial.read() = 255) {dosomething()}" –