Forum: Mikrocontroller und Digitale Elektronik Java+Grbl: G-Code Befehle mit Java an Arduino senden und lesen


von Pascal Keller (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
ich möchte mit Java und der Bibliothek jSerialComm an einen Arduino mit 
Grbl G-Code Befehle senden und damit einen Schrittmotor ansteuern.
Bisher funktioniert nur das lesen, nicht aber das senden!

Ausgabe Konsole:
run:
1 :COM9
1
Gewählter Port: 1
USB-SERIAL CH340 (COM9)

Grbl 0.9a ['$' for help]


Der Hardware Aufbau funktioniert soweit, getestet hab ich es mit Arduino 
Serial Monitor.

Zum Programm:
Ich gebe zuerst alle aktive COM Ports aus, lasse dann den Benutzer über 
die Konsole einen wählen. Dann starte ich zwei Threats zum gleichzeitig 
lesen und senden von G-Code.

Findet jemand den Fehler warum das Senden nicht funktioniert?

// -------------------------------------------------------------------

package com.port;

import java.util.Scanner;
import java.io.OutputStream;
import java.io.PrintWriter;
import com.fazecast.jSerialComm.SerialPort;

public class Main {

    static int inputPort=0;
    static SerialPort chosenPort;

    public static void main(String[] args) {

  // Aktive COM Ports ausgeben
  SerialPort[] portNames = SerialPort.getCommPorts();
  int i;
        for(i = 1; i <= portNames.length; i++)
            System.out.println(i+" 
:"+portNames[i-1].getSystemPortName());

        // Benutzer wählt COM Port
        Scanner scan = new Scanner(System.in);
        do{
            try{
                int input = Integer.parseInt(scan.nextLine());
                if((input>0) && (input<i))
                inputPort = input;
                else
                System.out.println("Bitte richtige Zahl eingeben!");
            }catch(Exception e){
                System.out.println("Bitte eine Zahl eingeben!");
            }
        }while(inputPort==0);

        System.out.println("Gewählter Port: "+inputPort);



        chosenPort = SerialPort.getCommPorts()[inputPort-1];
        chosenPort.setComPortTimeouts(SerialPort.TIMEOUT_SCANNER, 0, 0);

        System.out.println(chosenPort.getDescriptivePortName());

        if(chosenPort.openPort()) {

            // Seriell Lesen
            Thread threadIn = new Thread(){
                @Override public void run() {
                    Scanner input = new 
Scanner(chosenPort.getInputStream());
                    while(input.hasNextLine()) {
                        try {
                            String line = input.nextLine();
                            System.out.println(line);
                        } catch(Exception e) {}
                    }
                }
            };

            // Seriell Schreiben
            Thread threadOut = new Thread(){
    @Override public void run() {
                    try {Thread.sleep(100); } catch(Exception e) {}
                    PrintWriter output = new 
PrintWriter(chosenPort.getOutputStream());
                    output.println("G0 X100");
                    output.flush();
                }
            };

            threadIn.start();
            threadOut.start();
        }
        else {
            System.out.println("COM Port konnte nicht geöffnet werden");
        }
    }
}

von Matthias T. (auchmonoabspielbar)


Lesenswert?

Hallo Pascal,

ich hätte eigentlich erwartet, dass Du eine Excpetion mit Erklärung der 
Fehlerursache bekommtst wenn etwas schief läuft. Aber aus der 
Dokumentation zum PrintWriter:

"Methods in this class never throw I/O exceptions, although some of its 
constructors may."

Der nächste Satz ist aber hilfreich:

"The client may inquire as to whether any errors have occurred by 
invoking checkError()."

Vielleicht findest hier eine Erklärung dafür, was falsch läuft.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.