Showing posts with label RXTX. Show all posts
Showing posts with label RXTX. Show all posts

Sunday, June 23, 2013

Create Java project using librxtx-java in Netbeans, work with Arduino

remark: This example work on Ubuntu.

Before create our Java project using librxtx-java, we have to setup something in our PC, refer to lastr post "Setup RxTx for Arduino and Java example".

Create Netbeans Java Project:

- Start Netbeans, Click File -> New Project..., to create a project of Java Application in Java categories.


- with Project Name of SerialTest


Modify the code:

Basically, it's same as the example code in Arduino Playground of Arduino and Java, except the package, and PORT_NAMES of "/dev/ttyACM0".

package serialtest;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import gnu.io.CommPortIdentifier; 
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent; 
import gnu.io.SerialPortEventListener; 
import java.util.Enumeration;


public class SerialTest implements SerialPortEventListener {
 SerialPort serialPort;
        /** The port we're normally going to use. */
 private static final String PORT_NAMES[] = { 
                        "/dev/ttyACM0", //for Ubuntu
   "/dev/tty.usbserial-A9007UX1", // Mac OS X
   "/dev/ttyUSB0", // Linux
   "COM3", // Windows
 };
 /**
 * A BufferedReader which will be fed by a InputStreamReader 
 * converting the bytes into characters 
 * making the displayed results codepage independent
 */
 private BufferedReader input;
 /** The output stream to the port */
 private OutputStream output;
 /** Milliseconds to block while waiting for port open */
 private static final int TIME_OUT = 2000;
 /** Default bits per second for COM port. */
 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;
  }

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

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

 /**
  * Handle an event on the serial port. Read the data and print it.
  */
 public synchronized void serialEvent(SerialPortEvent oEvent) {
  if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
   try {
    String inputLine=input.readLine();
    System.out.println(inputLine);
   } catch (Exception e) {
    System.err.println(e.toString());
   }
  }
  // Ignore all the other eventTypes, but you should consider the other ones.
 }

 public static void main(String[] args) throws Exception {
  SerialTest main = new SerialTest();
  main.initialize();
  Thread t=new Thread() {
   public void run() {
    //the following line will keep this app alive for 1000 seconds,
    //waiting for events to occur and responding to them (printing incoming messages to console).
    try {Thread.sleep(1000000);} catch (InterruptedException ie) {}
   }
  };
  t.start();
  System.out.println("Started");
 }
}

In order to access Serial port in Ubuntu, you have to setup the right of the port. Refer to the post Fixed the problem of "No device found on COM1" for /dev/ttyACM0. You have to enter the following command before run the code:

$sudo chmod a+rw /dev/ttyACM0

If everything OK, you can run the program as shown below, the message "Hello world" will be printed every second in Output windows.



Next:
- Communication between Arduino and PC running Java, with JavaFX UI

Setup RxTx for Arduino and Java example

Refer to the post "Arduino and Java", Arduino Playground provide a example of Java code work with Arduino with RxTx library. I will create it work in Netbeans in next post, "Create Java project using librxtx-java in Netbeans, work with Arduino".

In Arduino side, you can 100% copy the provided sample and download to Arduino board, tested on Arduino Due.

List here:
void setup(){
  Serial.begin(9600);
}

void loop(){
  Serial.println("Hello world");
  delay(1000);
}


In PC side, you have to install librxtx-java, setup JAR in Netbeans, and copy librxtxSerial.so to your java library path. Refer to the post of "Install RXTX on Ubuntu" and "Setup RxTx jar and .so for Ubuntu".

The steps to build java program with NetBeans will be in next post. Finally, it will run as shown below.

running


Next:
- Create Java project using librxtx-java in Netbeans, work with Arduino
- Communication between Arduino and PC running Java, with JavaFX UI


Sunday, June 16, 2013

RXTX Java library


RXTX is the Java library Arduino IDE used to communicate to the serial. It can be used by developers to develop applications communicating with Arduino board.

Visit RXTX home page