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(); } } } }