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!
Leave a Reply