Pages: [1]   Go Down
Author Topic: Eclipse - Arduino Kommunikation  (Read 1310 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo zusammen,

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?

Vielen Dank Sven
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

Ein Ethernet-Shield geht natürlich auch, verursachte aber wieder mehr Kosten und größeren Programmieraufwand auf der Arduino-Seite.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Code:
    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.

Code:
boolean recieveNumber = false;
boolean complete = false;
int arrayposition = 0;
char incommingBuffer[20];
int incomming;

void setup(){
  Serial.begin(9600);
  pinMode(12, OUTPUT);
}

void readSerial(){
  while(Serial.available()>0){
   
    if(arrayposition <20){
    incomming = Serial.read();
    Serial.flush();
    incommingBuffer[arrayposition]=incomming;
    arrayposition++;
    }
  }
  recieveNumber = true;
}

void loop(){
  if (recieveNumber == false){
    readSerial();
  }
  else if (complete == false){
    for(int i=0;i<arrayposition;i++){
      if(incommingBuffer[arrayposition]==0){
        digitalWrite(12, HIGH);   
        delay(1000);             
        digitalWrite(12, LOW);             
      }
      else{
        delay(1000);
      }
    }
    complete = true; 
  }
}

Ich habe bestimmt mal wieder einen riesen Denkfehler aber vielleicht könnt ihr mir ja auf die Sprünge helfen.
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

0
Offline Offline
Faraday Member
**
Karma: 24
Posts: 3496
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink
Logged

Check out my experiments http://blog.blinkenlight.net

Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hier nochmal die ganze Klasse:

Code:
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.

Code:
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)

Logged

Pages: [1]   Go Up
Jump to: