Arduino ile Java’nın Seri Port Üzerinden Haberleşmesi

Arduino ile Java’nın Seri Port Üzerinden Haberleşmesi

Merhaba arkadaşlar bu yazımda sizlere Java programlama dili ile seri port üzerinden arduino ile nasıl haberleşebileceğimizi göstereceğim. Aslında hali hazırda arduino’nun resmi sitesinde kodu bulunmaktadır fakat bu kodda sadece serial read işlemleri yapılıyor seri porta değer yazmıyor. Benim yazdığım kodda ise Seri port üzerinden arduino’ya değer gönderiyoruz ve değeri okuyabiliriyoruz.

import java.io.BufferedReader;
import java.io.IOException;
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
			"COM5", // 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 static 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", "COM5");

		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("Resetting and Starting Arduino");
                Thread.sleep(3000);
		System.out.println("Connection Started");
		try{
			String command = "emre bektas.com\n";
			char[] char_array = command.toCharArray();
			Thread.sleep(100); // veri göndermeden önce bu thread gerekiyor.
				for (int i = 0; i < char_array.length; i++) {
					output.write(char_array[i]);
				}
			Thread.sleep(100); // connection kapatmadan önce bu thread gerekiyor.
			} catch(IOException ioe) {
			ioe.printStackTrace();
			} catch(InterruptedException ie) {
			ie.printStackTrace();
			}
		main.close(); // connection u kapattık. eğer sürekli veri gönderilip alınacaksa bu komut kaldırılmalı.
		System.out.println("Connection Closed");
	}

	
}

Ek olarak java’nın serialport kütüphanesini kullanabilmeniz için projenize txrxcommunication kütüphanesini eklemeniz ve rar dosyasının içindeki win 32 ve win 64 işletim sisteminiz kaç bit ise içerisindeki rxtxSerial.dll dosyasını C:\Windows klasörüne atmanız gerekmektedir. Eğer Netbeans kullanıyorsanız windows klasörüne dll dosyasınız atmanız gerekebilir fakat eclipsede sadece  RXTXcomm-2.2pre2.jar dosyasını projeye import etmem yetti.Dosyaları ekten indirebilirsiniz…

Eğerki her defasında jar dosyasını projenize eklemek istemiyorsanız c:\Program Files\Java\kullandıgınızjava\lib\ext klasörün e RXTXcomm-2.2pre2 dosyasını kopyalayınız…

java and arduino communication

 

 

[su_button url=”https://drive.google.com/file/d/0Bypgi5nv-lAOQldKLW9Kenp0dkU/” target=”blank” style=”3d”]Download[/su_button]

Emre Bektaş

Computer Engineer C# / Java Developer

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *