![]()  | 
| Communication between Arduino and PC running Java, with JavaFX UI | 
It's a very simple code in Arduino side:
void setup() {
  Serial.begin(9600);
}
void loop() {
  if(Serial.available() > 0){
    Serial.print((char)Serial.read());
  }
}
In PC side, it's modified from last post, implement in JavaFX, with bi-direction communication.
package javafx_arduinotestserial;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
/**
 * @web arduino-er.blogspot.com
 */
public class JavaFX_ArduinoTestSerial extends Application {
    MyRxTx myRxTx;
    Label textInfo, textIn;
    @Override
    public void start(Stage primaryStage) {
        final TextField textOut = new TextField();
        textOut.setText("Hello Arduino-er!");
        textInfo = new Label();
        textIn = new Label();
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                String stringOut = textOut.getText() + "\r\n";
                try {
                    myRxTx.output.write(stringOut.getBytes());
                } catch (IOException ex) {
                    Logger.getLogger(
                            JavaFX_ArduinoTestSerial.class.getName())
                            .log(Level.SEVERE, null, ex);
                }
            }
        });
        VBox panel = new VBox(10);
        panel.setPadding(new Insets(10, 10, 10, 10));
        panel.getChildren().addAll(textInfo, textOut, btn, textIn);
        StackPane root = new StackPane();
        root.getChildren().add(panel);
        Scene scene = new Scene(root, 300, 250);
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
        myRxTx = new MyRxTx();
        myRxTx.initialize();
    }
    public static void main(String[] args) {
        launch(args);
    }
    class MyRxTx implements SerialPortEventListener {
        SerialPort serialPort;
        /**
         * The port we're normally going to use.
         */
        private final String PORT_NAMES[] = {
            "/dev/ttyACM0", //for Ubuntu
            "/dev/tty.usbserial-A9007UX1", // Mac OS X
            "/dev/ttyUSB0", // Linux
            "COM3", // Windows
        };
        private BufferedReader input;
        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();
            //First, Find an instance of serial port as set in PORT_NAMES.
            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;
            } else {
                textInfo.setText("Port Name: " + portId.getName() + "\n"
                        + "Current Owner: " + portId.getCurrentOwner() + "\n"
                        + "Port Type: " + portId.getPortType());
            }
            try {
                // open serial port, and use class name for the appName.
                serialPort = (SerialPort) portId.open(this.getClass().getName(),
                        TIME_OUT);
                // set port parameters
                serialPort.setSerialPortParams(DATA_RATE,
                        SerialPort.DATABITS_8,
                        SerialPort.STOPBITS_1,
                        SerialPort.PARITY_NONE);
                // open the streams
                input = new BufferedReader(
                        new InputStreamReader(serialPort.getInputStream()));
                output = serialPort.getOutputStream();
                // add event listeners
                serialPort.addEventListener(this);
                serialPort.notifyOnDataAvailable(true);
            } catch (Exception e) {
                System.err.println(e.toString());
            }
        }
        @Override
        public void serialEvent(SerialPortEvent spe) {
            if (spe.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
                try {
                    final String inputLine = input.readLine();
                    Platform.runLater(new Runnable() {
                        @Override
                        public void run() {
                            textIn.setText(inputLine);
                        }
                    });
                    System.out.println(inputLine);
                } catch (Exception e) {
                    System.err.println(e.toString());
                }
            }
        }
        /**
         * This should be called when you stop using the port. This will prevent
         * port locking on platforms like Linux.
         */
        public synchronized void close() {
            if (serialPort != null) {
                serialPort.removeEventListener();
                serialPort.close();
            }
        }
    }
}

So what does exactly the part of The Arduino does? :)
ReplyDeleteFrom what i saw it only prints the message. :) It doenst retrieve it
Thank you very much!