Java ile Seri Port Okumak

Java’da seri port okumak son derece kolay bir iş, korkacak birşey yok…

Bu iş için, öncelikle RXTX sitesinden RXTX 2.1’i indirin. 2.0 sürümü Sun’ın (Windows desteği olmayan) CommAPI’sine ihtiyaç duyar, bu yüzden Windows ortamında 2.1’i tercih etmeniz önemli.

İndireceğiniz ZIP dosyasındaki rxtxParallel.dll ve rxtxSerial.dll dosyalarını, c:\windows\system32 dizinine (veya buna karşılık gelen dizine) kopyalayın. Bu işlemi, programın Deploy edileceği makina üzerinde de yapmanız gerekeceğini unutmayın.

Artık çalışmaya başlayabilirsiniz. Yeni bir Java projesi yaratın, ve yine ZIP dosyasında bulacağınız RXTXcomm.jar kütüphanesini projenize dahil edin.

Projenizde, TwoWaySerialComm adlı bir sınıf yaratın. Bu sınıf, seri porttaki hareketleri izleyeceğiniz sınıf olacaktır. Kodları ise, kabaca aşağıdaki gibi olmalıdır:

import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;

import java.io.FileDescriptor;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class TwoWaySerialComm
{
 public static String lastData;

public TwoWaySerialComm()
 {
 super();
 lastData = "";
 }

void connect ( String portName ) throws Exception
 {
 CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
 if ( portIdentifier.isCurrentlyOwned() )
 {
 System.out.println("Error: Port is currently in use");
 }
 else
 {
 CommPort commPort = portIdentifier.open(this.getClass().getName(),2000);

if ( commPort instanceof SerialPort )
 {
 SerialPort serialPort = (SerialPort) commPort;
 serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);

InputStream in = serialPort.getInputStream();
 OutputStream out = serialPort.getOutputStream();

(new Thread(new SerialReader(in))).start();
 (new Thread(new SerialWriter(out))).start();

}
 else
 {
 System.out.println("Error: Only serial ports are handled by this example.");
 }
 } 
 }

/** */
 public static class SerialReader implements Runnable 
 {
 InputStream in;

public SerialReader ( InputStream in )
 {
 this.in = in;
 }

public void run ()
 {
 byte[] buffer = new byte[1024];
 int len = -1;
 try
 {
 while ( ( len = this.in.read(buffer)) > -1 )
 {
 lastData = new String(buffer, 0, len);
 System.out.print(new String(buffer,0,len));
 }
 }
 catch ( IOException e )
 {
 e.printStackTrace();
 } 
 }
 }

/** */
 public static class SerialWriter implements Runnable 
 {
 OutputStream out;

public SerialWriter ( OutputStream out )
 {
 this.out = out;
 }

public void run ()
 {
 try
 { 
 int c = 0;
 while ( ( c = System.in.read()) > -1 )
 {
 this.out.write(c);
 } 
 }
 catch ( IOException e )
 {
 e.printStackTrace();
 } 
 }
 }
}

serialPort.setSerialPortParams komutunu, seri porta bağladığınız cihazın özelliklerine göre modifiye etmeniz gerekebilir. Bu sınıf; başlayacak ek bir Thread içerisinde, COM portundan gelen bütün verileri hem ekrana yazacak (System.out.print(new String(buffer,0,len));), hem de “lastData” adlı değişkene atayacaktır (lastData = new String(buffer, 0, len);). Gerçek bir uygulamada ekrana yazdırma kısmını silip, lastData içerisindeki veriye erişmek iyi bir fikir olacaktır. İhtiyaca bağlı olmakla birlikte, Event tabanlı bir yapı kurmak daha da iyi bir fikir olabilir.

Main sınıfınızda yapmanız gereken şey ise şudur:

public static void main(String[] args) {
 System.out.println("Program basladi...");
 try
 {
 TwoWaySerialComm a = new TwoWaySerialComm();
 a.connect("COM1");
 }
 catch ( Exception e )
 {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }

}

Buradaki COM1 değerini, bilgisayarınızdaki doğru portun adı ile değiştirmelisiniz.

İşte bu kadar basit!

Advertisement

Posted

in

,

by

Tags:

Comments

2 responses to “Java ile Seri Port Okumak”

  1. Mesut Avatar
    Mesut

    CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName); Bu ksımda Sürekli Hata Alıyorum Diğer anlattığınız herşeyi yaptım ancak burada şöyle
    gnu.io.NoSuchPortException
    at gnu.io.CommPortIdentifier.getPortIdentifier(CommPortIdentifier.java:218)
    at ProjeBaglantiDeneme.connect(ProjeBaglantiDeneme.java:25)
    at ProjeBaglantiDeneme.main(ProjeBaglantiDeneme.java:117)
    Bir hata alıyorum yardımcı olursanız sevinirim

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s