C# İle Seri Port Programlama

Bu makalemizde donanım programlama örneklerinde Port kontrolünü göreceğiz. Programlayacagımız portumuz ise Seri Port namı diğer RS232 standartı.
Seri Port en eski donanım iletişimlerindendir. Şu an yerini daha gelişmiş paralel veri seri iletim temelli iletişim uygulamalarına bırakmıştır.

Seri Porttan iletişim diğer iletişim arabirimlerine göre oldukça ilkel kalmaktadır. Şuan için Dizüstü bilgisayarlarda bu port kullanılmamakla beraber Masaüstü bilgisayarlarda da ortadan kalkmaktadır. Her ne kadar kullanımı azalan bir teknoloji olsa da iletişim arabirimlerine yeni başlayanların mutlaka öğrenmeleri gereken temel bir konudur,seri iletişim. Zira elektronik devre tasarımı ve bunun Bilgisayar ile haberleşmesi genelde Seri port üzerinden yapılır.

Seri iletişimi basitçe şöyle anlatabiliriz. Seri iletişimde veriler bit bit peşpeşe gönderilir. Bunların başında başlangıç ve bitiş bitleri de vardır. Seri iletişim ile veri alan taraf da bu bitlerin veri olan kısmındaki sekiz (5-8 arasında başka bir değer de olabilir) biti alır ve bunlardan bir Byte haliyle bir karakter elde eder.Bu karakterlerin bileşimi de zaten bize verinin kendini vermektedir.

Seri iletişimde iletişimin bazı kuralları var. Aslında kuraldan çok parametre diyebiliriz. Eğer iki taraf haberleşmek istiyorlarsa parametrelerinin aynı olmaları gerekmektedir. Mesela ilk parametremiz “İletişim Hızı”dır. BAUD oranı de denilen bu hız saniyede gönderilecek bit sayısını(bit/sn) bize verir. İletişim için gönderen ve alan tarafın BAUD hızları eşit olmalıdır.

Diğer bir parametre olarak da karşımıza “Veri Uzunluğu” çıkıyor. Veri uzunluğu kaç bitin anlamlı bir bütün olduğunu bize gösterir. Standart olarak bir byte uzunluğu olarak 8 bit olsa da bu değer beş ila sekiz arasında bir değer alabilir.Tarafların veri uzunluklarının farklı olması alınan verinin bozulmasına neden olur. Sekiz bit gönderen taraf için beş bit alan taraf da veri bitleri eşlik ya da başlangıç biti olarak algılanabilir bu da istenmeyen sembollerle karşılaşmamıza neden olur.

RS232 standartının çok güvenli olduğu söylenemez. Güvenlik için Eşlik(Parite) biti kavramı kullanılmaktadır. Eşlik biti gönderilecek verinin bitlerinin toplamına göre “1” ya da “0” değerini alır. Karşı taraf da yine bu biti hesaplar ve gelen eşlikle olması gereken eşliğe göre verinin bozulup bozulmadığını anlar.

Seri portu temel olarak öğrendikten sonra artık programlamaya geçebiliriz.

C#’da Seri port programlarken “System.IO.Ports” isimalanını kullanacagız. Burada SerialPort bileşeninin elemanlarını kullanacagız.

SERİALPORT BİLEŞENİ:

SerialPort bileşeni .NET 2.0 ile birlikte geldi. Seri portu programlamada birçok kolaylık getirmiştir. SerialPort bileşeni Araç Kutusunda(ToolBox) bulunmaktadır ve formumuzun üzerine Sürükle-Bırak yaparak programımıza portu okuma özelliğini rahatlıkla ekleyebilmekteyiz.


Ya da;

Console uygulamalarımızda ise SerialPort sınıfından bir nesne yaratarak yine Seri Portu kullanabiliriz.

SerialPort SeriPortum = new SerialPort();

Seri iletişim için nesnemizi bildirdik.Şimdi ise öncelikle parametrelerimizi nasıl kuruyoruz onları inceleyelim.

SERİ PORT PARAMETRE KURULUMU:

Port Seçimi:

Bazı bilgisayarlarda Seri Porttan birden fazla bulunur. Bundan dolayı programlarımızda bunu göz önünde bulundurmalıyız. Eğer herhangi bir port seçimi yapmazsak bilgisayar otomatik olarak Com Port 1’i seçecektir. Port seçimi için “PortName” özelliğini kullanırız. Bu özelliğe Port numarasına göre “COM1-COM2” gibi string değerler girilir.

Örnek Bildirim:

SeriPortum.PortName = “COM2”;

İletişim Hızının Kurulumu:

Hangi portu kullanacagımızı seçtikten sonra şimdi İletişim Hızımızı(BAUD) bildirelim. Bunun içinse “BaudRate” özelliğini kullanıyoruz. Değer olarak tamsayı bir değer girilmelidir.

Örnek Bildirim:

SeriPortum.BaudRate = Convert.ToInt32(BaudHizi.Text.ToString());

Veri Uzunluğunun Kurulumu:

Bir başka parametremiz de Veri Uzunluğuydu. Veri uzunluğunu belirmek için de “DataBits” özelliğini kullanmaktayız. Bu özelliğe de beş-sekiz arasında bir tamsayı girilmelidir.

Örnek Bildirim:

SeriPortum.DataBits = Convert.ToInt32(VeriUzunlugu.Text.ToString());


Eşlik Biti Seçimi:

Kullanacagımız son parametremiz de Eşlik(Parite) bitini belirtilmesi.Eşlik biti de “Parity” özelliği ile tutulur. Yanlız burada bizim gireceğimiz değerlendense önceden tanımlanmış bazı değerleri kullanmak daha kullanışlı ve okunabilir olmaktadır.

Bu enum sabitleri:

None(Yok) Parite: Parity.None

Odd(Tek) Parite: Parity.Odd

Even(Çift) Parite: Parity.Even

Mark(Boşluk) Parite:Parity.Mark

Space(İşaret) Parite: Parity.Space

Örnek Bildirimler:

SeriPortum.Parity = Parity.Odd;

SeriPortum.Parity = Parity.Mark;

***NOT: Eğer herhangi bir parametre kurulumu yapmazsanız programınız Seri port parametreleri olarak bilgisayar varsayılan değerlerini kullanacaktır.Yani Com Port 1, 9600(bit/sn) Baud Rate, 8 Bit veri uzunluğu, None(Yok) parite.


Parametrelerimizi kurduk karşı taraf da bizimle aynı iletişim parametrelerine kurulu. Bundan sonrası portumuzu iletişime açmak ve veri alış-verişi yapmaya kalıyor.

VERİ İLETİŞİMİ

Seri Portun Açılması ve Kapatılması:

Windows XP portlara direk erişime izin vermemektedir. Bu kullanacagımız portu önce iletişim için açmalıyız. Seri portun açılması için Open() methodunu kullanırız. Portumuzu açarken dikkat etmemiz gereken birşey var. Eğer kullanmak istediğimiz portumuz daha öncesinde açık ise bir hata ile karşılaşırız. Bu yüzden öncelikle portun kullanılıp kullanılmadığına bakmalıyız. Bunun için IsOpen ile portun duruma bakarız portumuzu ona göre açarız.

Örnek Bildirim:

if (SeriPortum.IsOpen == false)
{

SeriPortum.Open();

}

Portu açmakla beraber artık porttan veri alımına başlamış bulunuyoruz. Bundan sonrası alınan verilerin okunması ya da Seri Porta veri gönderimidir.

Portumuzdan veri alıyorken veri akışını durdurabiliriz. Bunun için portu kapatırız.Portu kapatmak için Close() methodunu kullanırız.

Örnek Bildirim:

SeriPortum.Close();

Seri Porttan Veri Alma-Gönderme:

Parametrelerimizi kurduk,portumuzu da açtık şimdi ise WriteLine() ve ReadLine() methodları ile veri Alım-Verimine kaldı.

Örnek Bildirimler:

string veri = SeriPortum.ReadLine(); //Seri porttan veri okur.

SeriPortum.WriteLine(veri); //Seri porta veri yazar.

Seri porttan veri okumak ve porta veri göndermek bu kadar basit. Bu bilgilerle temel olarak yeterli seviyelerde uygulamalar yazabilirsiniz.

Ama isterseniz burada durmayalım ve programlarınızı daha yetenekli hale getirmek için biraz daha geliştirelim. Seri Port bir Olay(Event) içinde okuyalım.

SERİALPORT DATARECEIVED OLAYI(EVENT):

Burayı incelemeden önce C#’ın temel konularından olan Olay(Event) kavramını öğrenmenizi öneriyoruz. Olay kavramı kısaca bir olay olduğunda istediğimiz şeyleri programımıza yaptırmaktır. Mesela evinizde televizyon izlerken birden telefon çalıyor. Ve siz haliyle telefona bakıyorsunuz. Burada telefonun çalması bir olay iken sizin telefona bakmanız olay işleyicidir.

Olay kavramını bu kadar açıkladıktan sonra bizimle ilgili kısmına dönelim. Serial Port bileşeninin içinde bir de SerialPort DataReceived olayı bulunmaktadır. Adından da belli olduğu üzere bu Olay, Seri Porttan veri geldiğini bildirmektedir. Biz de bu olay olduğunda yani Seri Porttan veri geldiğinde bu verileri okuyacagız,yani telefon çaldığında telefona bakacağız. Telefon çalmıyorsa telefona bakmanın bir alemi yok.

Olayların belli dizim sıralamaları vardır. Ama SerialPort bileşeni olayı ve delegeleri kendi içinde tanımladığından bize sadece Olay işleyiciyi yazmak ve bunu DataReceived olayıyla ilişkilendirmek kalıyor.

İlişkilendirme işlemi “+=” operetörüyle yapılmaktadır.

Örnek Bildirim:

SeriPortum.DataReceived += new SerialDataReceivedEventHandler(Fonksiyonum);

Bu bildirim ilk başta olayları bilmeyenler için karmaşık gelebilir. Burada SeriPortum Porta eriştiğim nesnem. “DataReceived” veri geldiğini bildiren olayım. “SerialDataReceivedEventHandler” Olay işleyici methodumu temsil edecek delegem. “Fonksiyonum” ise olay gerçekleştiğinde yani seri porta veri geldiğinde çalıştıracagım bloğum.

Şimdi de veri geldiğinde çalışacak Methodumuzu yazalım:

Örnek Bildirim:

private void Fonksiyonum(object s, SerialDataReceivedEventArgs e)

{

string veri = SeriPortum.ReadLine();

}

Burada yaratılan methodum(Olay İşleyici) normal bir methoddan farkı yoktur. Sadece parametrelerinde bir değişiklik göstermektedir. Bunları açıklamak bu makelenin konusu değildir. Biz de burada gördüğünüz gibi bu parametreleri kullanmadık. Ama istenirse “e” parametresiyle SerialPort nesnesinin elemanlarına ulaşılıp methodumuzda kullanılabilir.

Böylece Seri portu olayın içinde okuyarak programımızı daha verimli hale getirdik. Buradan sonrası size ve hayal gücünüze kalıyor.

Aşagıda Seri porttan verileri alan ve ListBox’a yazdıran basit bir program var.
Kaynak kodları inceleyerek siz de kendi uygulamalarınızı geliştirebilirsiniz

Seri Port Okuma Örneği

ALINTIDIR : Murat ÇAKMAK

Bir yorum bırakın

This site uses Akismet to reduce spam. Learn how your comment data is processed.