ich habe folgendes Problem. Ich habe in Eclipse ein Java-Programm geschrieben, welches mir einen String zurückgibt. Dieser String soll nun an ein Programm auf dem Arduino geschickt werden welcher dort verarbeitet wird. Danach soll das Board dann mit der Arbeit beginnen und eben dieses Programm ausführen. Wie schaffe ich es diese Kommunikation zu erstellen? Kann man hier vielleicht den Arduino Ethernet Shield nutzen?
Der direkteste Weg ist vermutlich das über die serielle Verbindung zu machen, die Du über der USB-Kabel ja schon hast. Wichtig ist nur, das Du vor dem Starten Deines Java-Programms die Arduino-IDE beendest, damit diese nicht die serielle Schnittstelle blockiert.
Beispiele hier:
Ersteinmal vielen dank für die Hilfe. Habe es geschafft über RXTX eine Kommunikation mit dem Arduino herzustellen. Ich kann auch in Eclipse gesendete daten vom Arduino empfangen. Nun habe ich aber Probleme bei dem Senden der Daten zum Arduino. Ich möchte dem Arduino nacheinander Zahlenwerte aus einem Array übergeben. Aber sobald ich output.write aufrufe bekomme ich eine NullPointerException. Bis zum Aufruf der Methode funktioniert auch alles richtig.
public void writeData(int[] manchester){
for(int i = 0; i< manchester.length;i++){
int help = manchester[i];
try{
output.write(help);
output.flush();
}
catch (Exception e){
System.err.println(e.toString());
}
}
}
Hier noch der dazugehörige Arduino Code. Es sollen erstmal nur die Zahlen zwischengespeichert werden um dann entsprechend LED einzuschalten.
Dein Problem scheint schon ein Java-Problem zu sein. Wo bekommt die Methode "writeData()" denn das output her, das sie verwendet? Ist das denn überhaupt initialisiert? Poste am besten mal die dazugehörige Java-Klasse vollständig.
Mario.
Er sagt ja "null pointer exception". Ganz offensichtlich ist output nicht initialisiert.
@Ultima Force: es gehört sich eigentlich vorher die Analyse sauber aufzubereiten. Sprich: ein Minimalbeispiel zu erstellen mit dem sich der Fehler reproduzieren lässt und das vollständige Beispiel zu posten.
Den vollständigen Code zu posten ist nicht OK. Es ist aber genausowenig OK nur den Teil zu posten den man selber für Fehlerhaft hält. Und dann wäre es auch schön den genauen Abbruch zu zeigen, d.h. welche Zeile hat denn den Fehler verursacht.
Wenn man das so angeht, dann kann man 90% der Fragen direkt selber beantworten
import java.io.IOException;
import java.io.OutputStream;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import java.util.Enumeration;
public class SendToArduino{
SerialPort serialPort;
private static final String PORT_NAMES[] = {
"/dev/tty.usbserial-A9007UX1", // Mac OS X
"/dev/ttyUSB0", // Linux
"COM6", // Windows
};
private OutputStream output;
private static final int TIME_OUT = 2000;
private static final int DATA_RATE = 9600;
public void initialize() {
CommPortIdentifier portId = null;
Enumeration<?> portEnum = CommPortIdentifier.getPortIdentifiers();
// iterate through, looking for the port
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);
output = serialPort.getOutputStream();
serialPort.notifyOnDataAvailable(true);
} catch (Exception e) {
System.err.println(e.toString());
}
}
public synchronized void close() {
if (serialPort != null) {
serialPort.removeEventListener();
serialPort.close();
}
}
public void writeData(int[] manchester){
for(int i = 0; i< manchester.length;i++){
int help = manchester[i];
try {
output.write(help);
output.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void getByteArray (String manchesterCode){
int manchester[] = new int[manchesterCode.length()];
for(int i = 0; i<manchesterCode.length();i++){
final String help = String.valueOf(manchesterCode.charAt(i));
if(help.equals("0")){
manchester[i]=0;
}
else if(help.equals("1")){
manchester[i]=1;
}
else if(help.equals("2")){
manchester[i]=2;
}
else {
manchester[i]=3;
}
}
writeData(manchester);
}
public void start(String manchesterCode){
SendToArduino main = new SendToArduino();
main.initialize();
System.out.println("Started");
getByteArray(manchesterCode);
}
}
Die Klasse bekommt die Daten richtig übergeben und initialisiert das Array auch korrekt. Erst wenn output.write aufgerufen wird bekomme ich eine Exception. Dabei ist die Variable help, welche ich schreiben will auch mit einer Zahl beleget. Hier nochmal die dazugehörige Konsolenausgabe.
Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version = RXTX-2.1-7
Started
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at SendToArduino.writeData(SendToArduino.java:66)
at SendToArduino.getByteArray(SendToArduino.java:92)
at SendToArduino.start(SendToArduino.java:99)
at ManchesterCodeMagnet.createCode(ManchesterCodeMagnet.java:66)
at SharedMagnetSecret.start(SharedMagnetSecret.java:24)
at AppWindow.buttonBerechneClickedCommit(AppWindow.java:130)
at AppWindow$3.actionPerformed(AppWindow.java:87)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)