10 Kasım 2008 Pazartesi

Java Seri Port Haberleşmesi (Serial Port Connection)

Daha önce geliştirdiğim bir projede Java ile seri port (Serial Port) üzerinden haberleşme yapmıştım. Bu projede ADASU Genel Müdürlüğü için, PDKS(Personel Devam Kontrol Sistemi) cihazlarıyla seri port üzerinden bağlantı kurarak personel giriş çıkışlarını kontrol eden bir sistem tasarlamıştım. Projede en çok zorlandığım kısım seri port'u kapatmak olmuştu (serialPort.Close) Çünkü öyle bir şey ki, port açılıyor ve programı sonlandırmadan kapatılamıyordu. Java ile yazılım geliştirenler bilir; "en büyük sorun, hata vermeyen hatalardır." :) Şimdi size açtığınız seri portu nasıl kapatacağınız hakkında bilgi vereyim. (How to close Serial Port)

Her şeyden önce projenize seri port ile haberleşme sağlayabilmek için CommDriver ve ana klasöre de win32com.dll kütüphanesini eklemelisiniz. Yoksa haberleşmeyi sağlayamazsınız. Ekte bulunan dosyalardan bunları indirebilirsiniz.

Java ile seri port bağlantısı (Serial Port Connection) için gerekli tüm bilgileri şu linklerde bulabilirsiniz

http://java.sun.com/products/javacomm/
http://www.java2s.com/
http://www.captain.at/
http://saloon.javaranch.com/

Ben size Google aramalarında bulmakta zorlanacağınız serialPort.Close() metodunun bir ayrıntısını aktaracağım. Önce serialPort.Open() fonksiyonunu yazalım;

public void open(String comPort, int baudRate, int timeOut) throws Exception {
 try {
  String drivername = "com.sun.comm.Win32Driver";
  CommDriver driver = (CommDriver) Class.forName(drivername)
   .newInstance();
  driver.initialize();
 } catch (Exception e) {
  e.printStackTrace();
 }
 try {
  portID = CommPortIdentifier.getPortIdentifier(comPort);
  serialPort = (SerialPort) portID.open(comPort, timeOut);
  inputStream = serialPort.getInputStream();
  outputStream = serialPort.getOutputStream();
  serialPort.addEventListener(this);
  //Kritik nokta! (It is critical!)
  serialPort.notifyOnDataAvailable(true);
  serialPort.setDTR(true);
  serialPort.setRTS(true);
  serialPort.setSerialPortParams(baudRate, SerialPort.DATABITS_8,
  SerialPort.STOPBITS_1,
  SerialPort.PARITY_NONE);
  portID.addPortOwnershipListener(this);
 } catch (Exception e) {
  e.printStackTrace();
 }
}

Aslında temel mantık "açarken ne yaptıysanız kapatırken tam tersini yapın" şeklinde. Fakat birini unutursanız (ki o çok kritik bir nokta) bildiğimiz Java hatasıyla karşılaşırsınız. Yani hiçbir hata yoktur ama program çalışmaz :) Buyurun şimdi serialPort.Close() metoduna;

public void closePort() throws Exception {
 try {
  serialPort.removeEventListener();
 } catch (Exception e) {
  e.printStackTrace();
 }
 try {
  portID.removePortOwnershipListener(this);
 } catch (Exception e) {
  e.printStackTrace();
 }
 try {
  //Kritik nokta! (It is critical!)
  serialPort.notifyOnDataAvailable(false);
  //En önemli ve aynı zamanda en mantıksız kısım burası.
  //Bunu unutursanız program hata vermemekle beraber 
  //port da kapanmıyor.
  //If you don't write this, the serial port will not close.
  inputStream.close();
  outputStream.close();
  serialPort.close();
 } catch (Exception e) {
  e.printStackTrace();
 }
}

Siz de dikkat etmişsinizdir sanırım. Kritik nokta dediğim yer, en gereksiz ayrıntı gibi duruyor. Ama ne yapalım bu JAVA. Bu yüzden "Java diyorum, başka da bir şey demiyorum."
Umarım yardımcı olabilmişimdir. İsteyen olursa kaynak kodları gönderebilirim.

Not: Bazı yerlerde İngilizce yazdığımı fark etmişsinizdir. Bu projeyi yaparken o küçük ayrıntı için oldukça fazla miktarda uğraşmıştım. Çözebilirsem bildiğim bütün dillerde yayınlayacağımı söylemiştim. Sadece İngilizce bildiğim için İngilizce yazdım. Ama her zaman için ortak lisan Java'dır :)

Hiç yorum yok:

Yorum Gönderme

Related Posts Plugin for WordPress, Blogger...