Daten mit eigenem Java Programm an Arduino senden, Problem!!!

Einen wunderschönen, guten Tag wünsche ich,

Ich habe folgendes Problem:
Hab ein Programm in Java geschrieben das über den Com Port Daten an den Arduino sendet.
Wenn ich das Programm starte und die Daten sende blinken die RX LED und die LED am DO 13 ein wenig und dann passiert nichts mehr, also Serial.available bleibt 0.
Wenn ich per SerialMonitor von Arduino was sende funktioniert alles aber nicht mit eigenem Java Programm.

So weit bin ich:
-COM Port und PortParameter stimmen
-Verbindung steht
-Ich schicke die Daten wie der SerialMonitor (hab mir den SourceCode besorgt und mit meinem verglichen)
-Hab auch beispiel Javaprogramm aus dem Inet probiert, geht auch nicht

mein Arduino sketch:

int led = 13;
String combine = "";
char buf[200];
void setup() {
// initialize serial:
Serial.begin(9600);


combine.reserve(200);
// reserve 200 bytes for the inputString:
pinMode(led, OUTPUT);
}
void loop() {
while (Serial.available()) {
digitalWrite(led, HIGH);
delay(500);
digitalWrite(led, LOW);
char inChar = (char)Serial.read();
combine = combine + inChar;
}
combine.toCharArray(buf, combine.length());
Serial.println(buf);
delay(10);
}

Entscheidende Zeilen aus meinem Java Programm:
enumComm = CommPortIdentifier.getPortIdentifiers();

while(enumComm.hasMoreElements()){
serialPortID = (CommPortIdentifier) enumComm.nextElement();

messageTextArea.append("\n>>Opening Port <" + serialPortID.getName() + ">");
messageTextArea.setCaretPosition(messageTextArea.getDocument().getLength());
//Serial Port öffnen
try {
serialPort = (SerialPort) serialPortID.open("Arduino", 500);
}
catch (PortInUseException e) {
messageTextArea.append("\n>>Port is already in use");
messageTextArea.setCaretPosition(messageTextArea.getDocument().getLength());
continue;
}


//Outputstream erreichen
try {
out = serialPort.getOutputStream();
}
catch (IOException e) {
messageTextArea.append("\n>>OutputStream not reachable");
messageTextArea.setCaretPosition(messageTextArea.getDocument().getLength());
continue;
}

//Inputstream erreichen
try {
in = serialPort.getInputStream();
}
catch (IOException e) {
messageTextArea.append("\n>>InputStream not reachable");
messageTextArea.setCaretPosition(messageTextArea.getDocument().getLength());
continue;
}

//SerialPort Parameter setzen
try {
serialPort.setSerialPortParams(9600, dataBits, stopBits, parity);
}
catch(UnsupportedCommOperationException e) {
messageTextArea.append("\n>>Unable to set\nPort Parameter");
messageTextArea.setCaretPosition(messageTextArea.getDocument().getLength());
}

//Listener erstellen
try {
serialPort.addEventListener(new serialPortEventListener());
}
catch (TooManyListenersException e) {
messageTextArea.append("\n>>Could not create a\n Listener");
messageTextArea.setCaretPosition(messageTextArea.getDocument().getLength());
continue;
}

//Melden wenns was neues gibt
serialPort.notifyOnDataAvailable(true);

connected = true;

messageTextArea.append("\n>>Connected to Port\n <" + serialPortID.getName() + ">\n Asking vor Arduino");
messageTextArea.setCaretPosition(messageTextArea.getDocument().getLength());

try {
Thread.sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(Frame.class.getName()).log(Level.SEVERE, null, ex);
}

try {
out.write("Hallo Arduino\n\0\b".getBytes());
out.flush();
} catch (IOException ex) {

messageTextArea.append("\n>>Unable to send Bytes");
messageTextArea.setCaretPosition(messageTextArea.getDocument().getLength());
}

time = System.currentTimeMillis();
while(true){
try {
if(in.available() < 0) break;
}
catch (IOException ex) {
messageTextArea.append("\n>>Error Readig Data");
messageTextArea.setCaretPosition(messageTextArea.getDocument().getLength());
}
if(System.currentTimeMillis() - time >= TimeOut){
messageTextArea.append("\n>>Answer Timeout");
messageTextArea.setCaretPosition(messageTextArea.getDocument().getLength());
serialPort.close();
try {
out.close();
in.close();
} catch (IOException ex) {
Logger.getLogger(Frame.class.getName()).log(Level.SEVERE, null, ex);
}
connected = false;
break;
}
}



if(connected == true){
try {
num = in.read(bytebuf);
System.out.println("Message: " + new String(bytebuf, 0, num));
} catch (IOException ex) {
Logger.getLogger(Frame.class.getName()).log(Level.SEVERE, null, ex);
}

if("#".contentEquals(new String(bytebuf, 0, 1))){
messageTextArea.append("\n>>Found Arduino");
messageTextArea.setCaretPosition(messageTextArea.getDocument().getLength());
break;
}
else{
messageTextArea.append("\n>>Not Arduino");
messageTextArea.setCaretPosition(messageTextArea.getDocument().getLength());
continue;
}
}
}

Ich würde mich riesig freuen wenn mir jemand helfen könnte.
Ich bitte darum das sämtliche Einwürfe bezüglich Rechtschreibung ezt. , sprich alles was nichts mit meinem Problem zu tun hat, weggelassen werden. Danke :wink:

Geht denn die Lese-Richtung Arduino -> Java ?

Wenn die Rx- Led am Arduino aufblitzt, solltest du ja schonmal den richtigen Port erwischt haben. Dann ist es nur noch die Baudrate :wink:
... Oder dein String combine;
(Aber dann sollte die Led an Pin13 wenigstens ein paar mal blinken bevor der Arduino sich verabschiedet ... )

Wo stellst du nach deinem

                serialPort = (SerialPort) serialPortID.open("Arduino", 500);

die Baudrate auf 9600 ?

Hi erstmal Danke für die schnelle Antwort...

Also die Baudrate setze ich nachdem ich den In- und Outputstream geladen hab.

Also die RX LED blinkt 2-3 mal und die DO 13 1 mal. Nur Serial.available bleibt stätig 0.
Bis zum String Combine komm ich ja garnich...

Achso und Leserichtung Arduino Java funktioniert einwandfrei :slight_smile:

void loop() {
  while (Serial.available()) {
    digitalWrite(led, HIGH);
    delay(500);
    digitalWrite(led, LOW);
    char inChar = (char)Serial.read();
    combine = combine + inChar;
  }

Also die RX LED blinkt 2-3 mal und die DO 13 1 mal. Nur Serial.available bleibt stätig 0.

Also kommt er doch 1 mal bis zu
combine = combine + inChar;

Selbst wenn du die Arduino 1.0.5 verwendest, kannst du doch diesen String hierdurch ersetzen:

static char combine[100];
static char* cp = combine;
while (Serial.available() )
{
   digitalWrite(led, HIGH); 
   *cp = Serial.read();
   if ( *cp == '\n') 
   {
      *cp = 0;
      Serial.print (" Ganze Zeile angekommen : ");
      Serial.println (combine);
      cp = combine; // wieder auf Anfang
   } 
   else cp++;
}
delay(200);
digitalWrite(led, LOW);
// Serial.write('.');

Leserichtung Arduino --> Java funktioniert einwandfrei :slight_smile:

Glückwunsch !
Dann glaub ich nicht, dass ich heute abend mein altes Java - Beispiel rauskramen muss :wink:

Hey Danke für die Antwort das mit dem String werde ich versuchen.

Die LED 13 blinkt immer wenn eine Verbindung zum Arduino hergestellt wird... und wenn die LED durch Serial.available blinken würde, würde sie ne halbe Sekunde blinken und das macht sie nich... also kein Serial.available.
Wenn ich mit SerialMonitor was schicke leuchtet sie ne halbe sekunde und dann sendet das Arduino stätig den String...
sry Bin leicht genervt Weil ich schon seit gestern abend suche und nichts finde :-S deprimierend...

Nein, da hast du recht. Klar, beim open gibt es standardmässig erstmal ein Arduino-Reset, da blinkt die Led13 kurz auf ...
Dann wird es doch eher die Java-Seite sein ...

Werd mal kramen, was ich finde, oder "from scratch" Eclipse und RXTXcomm.jar wieder ausprobieren...

Das hier kennst du ? : http://rxtx.qbang.org/wiki/index.php/Two_way_communcation_with_the_serial_port

Ohman - Sketch vom Link läuft werde jetzt versuchen die Elemente bei mir einzubauen... Dankeeee...

trotzdem währe es mal Interessant warum das andere bei mir nicht funktioniert hat..

glaube lag daran das ich SerialPort und nicht CommPort verwendet hab... währe jetzt das einzige was mir auffällt...

Tausend Dank. *Prima

CommPort ist eine abstrakte Klasse die von SerialPort implementiert wird:
http://docs.oracle.com/cd/E17802_01/products/products/javacomm/reference/api/javax/comm/CommPort.html

Laut JavaDoc ist SerialPort nur für RS-232:
http://docs.oracle.com/cd/E17802_01/products/products/javacomm/reference/api/javax/comm/SerialPort.html

Das ist in .NET einfacher. Da geht die SerialPort Klasse auch für USB.

Java unterstützt direkte USB Kommunikation von Haus aus einfach nicht (oder hat man das inzwischen mal hinzugefügt?). Es gibt aber Java Libs die USB Kommunikation implementieren:
http://jusb.sourceforge.net/
http://www.jcp.org/en/jsr/detail?id=80

... Es verwendet auch niemand javax.comm ...
RXTXcomm.jar ( was auch mit der Arduino Software mitkommt ) implementiert gnu.io.SerialPort von rxtx.qbang.org

Aber ob via USB oder nicht ist Java egal ( bzw. unsichtbar ), da das eh in native Code betriebssystemabhängig gemacht wird.
Nachtrag: für windows in rxtxSerial.dll, was "zu meiner Zeit" besser in der 32 bit Version lief mit einer 32 bit jre ( wie Arduino auch )


            if ( commPort instanceof SerialPort )
            {
                SerialPort serialPort = (SerialPort) commPort;

SerialPort ist nur eine CommPort subclass (und CommPort ist auch hier eine abstrakte Klasse, wie Serenifly für javax.comm richtig bemerkt hat) eben seriell und nicht z.B. parallel )

Wenn du sicher bist und es nicht per Programm abfangen willst, solltest du auch gleich sowas schreiben können:

       SerialPort serialPort = (SerialPort)portIdentifier.open("MyArduino", 2000);
       serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);

Wobei ich nicht genau weiss, ob der Name (hier MyArduino) "nur Spass" ist. Sollte eigentlich theOwner sein, also ein Hinweis, wer den PortIdentifier belegt hat...

So Freunde ich hab's raus... Ich könnte mich so ärgern...

Serielle Kommunikation ist ganz einfach es hätte alles geklappt was ich geschrieben hab... das Problem war nur das nachdem ich die Verbindung zum Arduino aufgebaut habe hätte ich noch 1 - 2 sec warten sollen, und ich hab aber die Daten direkt hinterher geschmissen... deswegen hat das nicht funktioniert... SOOOO ein simpler Fehler.

Danke für eure Posts
Hoffe konnte auch anderen helfen...