Hallo ich arbeite an einem ständigen Datenaustausch zwischen Java und Arduino UNO R3. Als Schnittstellenbibliothek verwende ich die JSSC. Es soll also z.B. mit dem Arduino ein Poti oder ein LDR (Light dependet resistor) ausgelesen werden. Der Wert wird dann an ein Java-Programm auf dem PC geschickt, dort wird entschieden welche LED am Arduino leuchten soll. Das Ganze nicht nur einmal sondern ständig Arduino -> Java -> Arduino -> Java -> usw. hin und her…
Mir ist bewußt, dass solche Aufgaben der Arduino ganz einfach alleine bewältigen kann. Aber das ist nur das reduzierte Problem.
Ich habe ein Java Programm geschrieben (wie angefügt) bei dem diese Sache mittels eines Windows-Buttons schon funktioniert. Also der Sendevorgang an den Arduino durch einen MouseEvent ausgelöst wird. D.h. Java empfängt ständig Daten vom Arduino und wenn ich auf den Button drücke wird die Information „LL“ an den Arduino gesendet und dort ein LED geschaltet. Das klappt gut!
Jetzt verfolge ich die Idee, dass ein Event durch eine Bedingung ausgelöst wird. Also z.B. wenn der vom Arduino empfangene Wert eine bestimmten Betrag hat, soll Java selbständig die Information z.B. „L1“ an den Arduino gesendet werden. Anstatt des Buttons-Click sollte dies jetzt durch eine bestimmten Wert selbständig ausgelöst werden. Kann man also einen Listener/Event definieren der eine in der Funktion gleiche Aktion auslöst wie z.B. der MouseEvent?
Es müsst doch dann der serialEvent, welcher die Daten vom Arduino empfängt vorübergehend unterbrochen werden um Daten zu senden. Wahrscheinlich so lange bis der sendende Event (also von Java zum Arduino) wiederrum unterbrochen wird und der serialEvent wieder Daten empfangen kann. Soweit meine Vorstellung.
Leider hab ich noch keine Idee wie ich solch einen „selbstauslösenden“ Event implementieren, auslösen, behandeln, definieren usw. muss. Ich habe von der Listener- und Eventthematik sehr wenig Ahnung.
Kann mir da jemand bitte helfen?
Danke - Quax
Mir ist bewußt, dass solche Aufgaben der Arduino ganz einfach alleine bewältigen kann. Aber das ist nur das reduzierte Problem.
Ich habe ein Java Programm geschrieben (wie angefügt) bei dem diese Sache mittels eines Windows-Buttons schon funktioniert. Also der Sendevorgang an den Arduino durch einen MouseEvent ausgelöst wird. D.h. Java empfängt ständig Daten vom Arduino und wenn ich auf den Button drücke wird die Information „LL“ an den Arduino gesendet und dort ein LED geschaltet. Das klappt gut!
Jetzt verfolge ich die Idee, dass ein Event durch eine Bedingung ausgelöst wird. Also z.B. wenn der vom Arduino empfangene Wert eine bestimmten Betrag hat, soll Java selbständig die Information z.B. „L1“ an den Arduino gesendet werden. Anstatt des Buttons-Click sollte dies jetzt durch eine bestimmten Wert selbständig ausgelöst werden. Kann man also einen Listener/Event definieren der eine in der Funktion gleiche Aktion auslöst wie z.B. der MouseEvent?
Es müsst doch dann der serialEvent, welcher die Daten vom Arduino empfängt vorübergehend unterbrochen werden um Daten zu senden. Wahrscheinlich so lange bis der sendende Event (also von Java zum Arduino) wiederrum unterbrochen wird und der serialEvent wieder Daten empfangen kann. Soweit meine Vorstellung.
Leider hab ich noch keine Idee wie ich solch einen „selbstauslösenden“ Event implementieren, auslösen, behandeln, definieren usw. muss. Ich habe von der Listener- und Eventthematik sehr wenig Ahnung.
Kann mir da jemand bitte helfen?
Danke - Quax
Java:
// Programme entstanden in Anlehnung an einfache Beispielcodes
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import jssc.SerialPort;
import jssc.SerialPortEvent;
import jssc.SerialPortEventListener;
import jssc.SerialPortException;
@SuppressWarnings("serial")
public class SD3_mod1 extends JFrame implements SerialPortEventListener,
MouseListener {
// Deklarationen
private SerialPort sp = new SerialPort("COM3");
private JButton button1;
private JPanel mainPanel;
private JPanel buttonsPanel;
// Sammelen des ankommenden
private String sammler = "";
// Konstruktur ---------------------------------------------------------
public SD3_mod1(){
// Öffnen und deklarieren des COM3-Ports
try{
sp.openPort();
sp.setParams(19200, 8, 1, 0);
sp.addEventListener(this);
}catch(SerialPortException ex){
System.out.println(ex);
}
// Definition eines Panels mit Button --------------------------
mainPanel = new JPanel(new BorderLayout());
buttonsPanel = new JPanel(new GridLayout(1,2,0,0));
button1 = new JButton("LED A");
buttonsPanel.add(button1);
mainPanel.add(buttonsPanel, BorderLayout.PAGE_END);
button1.addMouseListener(this);
this.addMouseListener(this);
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
this.setContentPane(mainPanel);
this.pack();
this.setVisible(true);
}
// Einlesen und Verarbeiten des Datenstreams vom Arduino ------------------------
@Override
public void serialEvent(SerialPortEvent e) {
try{
byte[] buffer = sp.readBytes(10);
InputStream sBAIS = new ByteArrayInputStream(buffer);
BufferedReader serRed = new BufferedReader(new InputStreamReader(sBAIS));
try {
String line = serRed.readLine();
if(line.indexOf("S")>-1 && line.indexOf("E")>line.indexOf("S")){
line=line.substring(1, line.indexOf("E"));
System.out.println("Ausgabe: " + line);
parsing(line);
}
} catch (IOException e1) {
e1.printStackTrace();
}
}catch(SerialPortException ex){
System.out.println(ex);
}
}
// ------------------------------------------------------------------
@Override public void mouseClicked(MouseEvent e){}
@Override public void mouseEntered(MouseEvent e){}
@Override public void mouseExited(MouseEvent e){}
@Override public void mousePressed(MouseEvent e){}
@Override public void mouseReleased(MouseEvent e){
// MouseEvent mit Aktion belegen -> Daten an Arduino senden ---------
// Hier sollte dann die automatische Auswertung des vom Arduino -----
// gesendeten Wertes stattfinden und automatisch gesendet werden ----
if(e.getComponent()==button1){
try {
sp.writeBytes("LL".getBytes());
System.out.println("Maus released");
} catch (SerialPortException e1) {
e1.printStackTrace();
}
}
}
private void parsing(String line){
System.out.println("Annahme: " + line);
}
public static void main(String[] args) {
new SD3_mod1();
}
}