Java+Grbl: G-Code Befehle mit Java an Arduino senden und lesen

Gast #4496139
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");
        }
    }
}
Angehängte Dateien:
#4496149
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.