java arduino serial communication

13,544

Solution 1

After seeing the problems and struggling with RXTX and JSSC for while, I developed the JAVA Arduino Communication Library.

My library has (hopefullyy) great documentation(found on the SourceForge Wiki for the library) and tells you exactly how to install and use it. After downloading both JARs in the library and including them in your classpath, just include the following statement before your class definition:

import arduino.*;

Now, all you need is the following code snippet in your method, and you're good to go!

String ArduinoPort = ""; //Your port name here
int BAUD_RATE = 9600;
Arduino arduino = new Arduino(ArduinoPort, BAUD_RATE);
arduino.openConnection(); 
arduino.serialWrite('1'); //serialWrite is an overridden method, allowing both characters and strings.
arduino.serialWrite('1', 20); //its second parameter even allows delays. more details can be found in the documentation.

The library also comes with example code that I thought would help speed along the process.

Solution 2

it seems to be permission issue. try : sudo chmod 666 /dev/ttyACM0 (you usb ) and rerun the java code again.

Share:
13,544
Giu_ai
Author by

Giu_ai

Updated on June 05, 2022

Comments

  • Giu_ai
    Giu_ai almost 2 years

    I am trying to set up a java-arduino serial communication. So far I downloaded the code from the Arduino page (http://playground.arduino.cc/interfacing/java) but I get an error. Code:

    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/tty.usbserial-A9007UX1", // Mac OS X
                            "/dev/ttyACM0", // Raspberry Pi
                "/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() {
                    // the next line is for Raspberry Pi and 
                    // gets us into the while loop and was suggested here was suggested http://www.raspberrypi.org/phpBB3/viewtopic.php?f=81&t=32186
                    System.setProperty("gnu.io.rxtx.SerialPorts", "/dev/ttyACM0");
    
            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");
        }
    }
    

    That's the output i get:

    Stable Library ========================================= Native lib Version = RXTX-2.2pre2 Java lib Version = RXTX-2.1-7 WARNING: RXTX Version mismatch Jar version = RXTX-2.1-7 native lib Version = RXTX-2.2pre2
    Could not find COM port. Started

    I am using Linux. And I think the port is correct. Anyone could help?