Probleme mit Processing

Hi,

versuche gerade Daten vom Arduino mit Processing darzustellen. Aber als erstes wollte ich zwei Processing Anwendungen schreiben die mit einander kommunizieren können. Die eine Anwendung soll den COM Port öffnen und Daten in ihn schreiben, das zweite Programm soll den Comport öffnen und die Daten aus dem Port lesen.

Jetzt mein Problem, ich mache es genauso wie es in der Anleitung steht, Serial / Libraries / Processing.org , aber es funktioniert nicht.

Hier mein code :

// Example by Tom Igoe
import processing.serial.*;

// The serial port:
Serial myPort;

// List all the available serial ports:
println(Serial.list());

// Open the port you are using at the rate you want:
  myPort = new Serial(this, Serial.list()[0], 9600);

// Send a capital "A" out the serial port
  myPort.write(65);

Hier der Fehler der entsteht: ArrayIndexOutOfBoundsException: 0

Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version   = RXTX-2.1-7
Exception in thread "Animation Thread" java.lang.ArrayIndexOutOfBoundsException: 0
	at sketch_121210a.setup(sketch_121210a.java:29)
	at processing.core.PApplet.handleDraw(PApplet.java:2117)
	at processing.core.PGraphicsJava2D.requestDraw(PGraphicsJava2D.java:193)
	at processing.core.PApplet.run(PApplet.java:2020)
	at java.lang.Thread.run(Thread.java:662)

Ich kenne mich mit java leider nicht so gut aus, wie kann ich den Fehler beheben

Viele Grüße Nils Minor

myPort = new Serial(this, Serial.list()[0], 9600);

Du greifst auf den ersten Eintrag im Array zu, ohne zu überprüfen, ob es überhaupt einen Eintrag im Array gibt.

Hi,

verstehe, aber wie kann ich einen Eintrag machen, also wie kann ich einen COM port festlegen?

Sobald ich den Arduino an den PC anschließe, funktioniert das Programm, weil er dann einen COM Port zugewiesen bekommt.

Also vom Prinzip her muss ich nur einen COM Port festlegen, aber auch wenn ich da einen String wie "COM1" reinschreibe funktioniert es nicht.

Gruß Nils

myPort = new Serial(this, "COMXX", 9600);

Für COMXX natürlich deinen Port, müsste eigentlich funktionieren.

MHh wenn ich das mache, dann erzeugt er einen Fehler wenn ich in den Comport schreiben möchte:

Native lib Version = RXTX-2.1-7
Java lib Version   = RXTX-2.1-7
java.lang.NullPointerException
	at processing.serial.Serial.write(Unknown Source)
	at Simula.draw(Simula.java:51)
	at processing.core.PApplet.handleDraw(PApplet.java:2142)
	at processing.core.PGraphicsJava2D.requestDraw(PGraphicsJava2D.java:193)
	at processing.core.PApplet.run(PApplet.java:2020)
	at java.lang.Thread.run(Thread.java:662)
Exception in thread "Animation Thread" java.lang.RuntimeException: Error inside Serial.write()
	at processing.serial.Serial.errorMessage(Unknown Source)
	at processing.serial.Serial.write(Unknown Source)
	at Simula.draw(Simula.java:51)
	at processing.core.PApplet.handleDraw(PApplet.java:2142)
	at processing.core.PGraphicsJava2D.requestDraw(PGraphicsJava2D.java:193)
	at processing.core.PApplet.run(PApplet.java:2020)
	at java.lang.Thread.run(Thread.java:662)

verstehe, aber wie kann ich einen Eintrag machen, also wie kann ich einen COM port festlegen?

Sobald ich den Arduino an den PC anschließe, funktioniert das Programm, weil er dann einen COM Port zugewiesen bekommt.

Vielleicht solltest Du erst mal definieren, was Du genau willst. Willst Du immer auf Deine Serielle Schnittstelle zugreifen? Oder immer auf Deinen Arduino? Letzteres geht meines Wissens unter Windows nicht, da Du dort die Zuweisung zu den Com-Ports nicht festlegen kannst.

Du könntest Deinen Code so abändern:

// Open the port you are using at the rate you want:
if (! Serial.list().isEmpty()) {
  myPort = new Serial(this, Serial.list()[0], 9600);

// Send a capital "A" out the serial port
  myPort.write(65);
}

Damit greifst Du nur noch auf den Port zu, wenn er auch zur Verfügung steht.

Hi,

nein der Code funktioniert nicht, wenn ich keinen Arduino angeschlossen habe.

Nun ja generell hätte ich gerne beides, ich wollte als erstes zwei einzelne Programme schreiben die miteinander über einen COM Port kommunizieren,

Das eine Programm simuliert Daten und schickt diese in den COM Port, das Programm ersetzt quasi den Arduino und dient nur für Testzwecke.

Das zweite Programm liest die Daten aus dem COM Port von Programm eins und interpretiert diese.

Aber ich verstehe nicht wie ich mit processing einen COM Port anlegen kann.

Danke für die Hilfe bis her :slight_smile:

Gruß Nils

Du kannst in Processing keinen COM-Port anlegen. Ein COM-Port ist ein in der Regel physisch vorhandenes Gerät auf das man seriell zugreifen kann.
Wenn Du den Arduino an den PC steckst, meldet der sich als genau so ein Gerät bei Deinem PC. Der COM-Port ist dann die Schnittstelle über den dann auf den Arduino zugegriffen werden kann.

Es gibt Software, die auf dem PC eine serielle Schnittstelle simuliert und damit so tut als wäre ein entsprechendes Gerät angeschlossen.

Processing kann also nur auf schon am PC vorhandene serielle Schnittstellen zugreifen, egal was für eine Gerät das erstmal ist.

Schau Dir mal folgende Software an, evtl. hilft die Dir bei Deinen Tests:

Hi,
das hilft mir schon mal viel weiter,wenn ich weiß das Processing kein COM Port erstellen kann dann brauche ich das mit dem Programm nicht weiter versuchen :D.

Ich versuche es jetzt mit VS2010 und C++, habe hier schon eine API gefunden die auch in den Seriellen COM Port schreibt und ließt, deshalb habe ich mir gedacht das ich damit einen COM Port anlegen kann, und die Daten mit Processing auswerte aber auch das funtkioniert nicht, er verlangt das ich ein Gerät über USB Kabel anschließe. Dann dachte ich mich das ich einfach ein Gerät im Geräte Manager erzuege, aber ohne Treiber und dann diesen Port benutze, aber auch das funktioniert nicht.

Anscheinend ist das nicht so einfach so einen Port selbst zu erzeugen ...

Ja ich werde mir das Programm mal anschauen, vllt. klappt es ja damit.

Danke und Gruß Nils :slight_smile:

Es funktioniert :D.

habe im Netz gelsen das das schon mehrere Leute versucht haben, aber alle haben ein externes Programm genutzt, welches einen virtuellen COM port erzeugt.

Man kann zwar auch einen mi VS und c++ bauen, allerdings muss man dann dafür auch einen Treiber für den Port programmieren.

Wenn ich nun dein Programm verwende erzeugt er zwei virtuelle COM Ports die er mit einander verbindet, einen dieser Ports nutze ich für meine Übertragung und es klappt auch :D.

Werde mir jetzt noch ein Programm suchen, welches nur einen COM port anlegt und nicht zwei miteinander verbindet, das brauche ich ja nicht, außerdem kostet deine Version Geld vllt. finde ich ja was Open source mäßiges

danke für die Hilfe, wäre glaube ich nicht alleine draufgekommen :smiley:

Gruß Nils

Schön, das es jetzt funktioniert. Ich bezweifle aber, das Dir ein virtueller COM-Port reicht, wenn Du zwei Programme laufen lassen willst. Normalerweise ist der Zugriff auf einen Com-Port exklusiv, damit sich nicht zwei Programme in die Quere kommen und sich gegenseitig die Daten klauen.
Ich denke die Lösung mit den 2 virtuellen und verbundenen COM-Ports ist genau das was Du brauchst, um zwei Programme kommunizieren zu lassen.