Monthly Archives: Şubat 2010

C# Serial Port Bileşeni!

Siteme her gün bir makale eklemek istiyorum ama bir şekilde ne oluyorsa ekleyemiyorum. Okul beklediğimden de çok vaktimi aldı üstüne birde çalıştığım firmanın projeleri, okuldaki kulüp etkinlikleri derken bu zamana kadar makale ekleme fırsatım olmadı. Forumlarda gezindiğimde seri port ile ilgili birçok arkadaşın sıkıntısı oluyordu bende C#’ın ‘Serial Port’ bileşeni ile ilgili bir makale yazmak istedim. Şimdi bu bileşeni inceleyelim;

Yaptığımız yazılımlar bazen bir cihazla haberleşmek durumda kalabilir. Örnek olarak, bilgisayardan kontrol edebileceğiniz bir robot olabilir, ısı değeri okuyabileceğiniz bir sistem olabilir, kısacası bir sistemi bilgisayarınızdan kontrol etmek istiyorsanız serial port bileşeni sizin imdadınıza yetişiyor. Şimdi gelin bu sınıfın bazı faydalı fonksiyonlarını, olaylarını ve özelliklerini inceleyelim;

serialPort.BaudRate: SerialPort sınıfının BaudRate isimli özelliği bilgisayardan kontrol edeceğiniz sistem ile haberleşme esnasında ki veri iletişimi hızı. Bu özellik sistemden sisteme değişiklik göstermektedir. BaudRate için şunu söyleyebiliriz saniye gönderilen bit sayısı, eğer sisteminizle iletişim hızınız 9600 ise bilgisayarın seri portundan saniyede 9600 bit veri gönderip alabilirsiniz demektir. Bu yüzden eğer sisteminiz 19200 ise ve siz bilgisayar programından bu özelliği set etmez iseniz verileri sağlıklı bir şekilde gönderip alamayacaksınız çünkü bu özelliğin default değeri 9600.

serialPort.IsOpen: SerialPort sınıfının IsOpen isimli özelliği seri portun açık olup olmadığını bool türünden söyleyen bir özellik. Portu kullanmadan önce mutlaka açık olup olmadığını kontrol etmenizde fayda var eğer portu kullandıktan sonra kapatmadan tekrar açmaya çalışırsanız programınız hata verecektir.

serialPort.PortName: SerialPort sınıfının PortName isimli özelliği seri portunuzun ismini isteyecektir. Eğer bir çevirici kullanmadan direk seri porta bağladıysanız ‘COM1’, bir çevirici aracılığıyla ismini değişti ise ‘COM5’, ‘COM6’ vb. string türünden port isminizi girebilirsiniz.

serialPort.ReadTimeout: SerialPort sınıfının ReadTimeout isimli özelliği seri portun cihazdan kaç saniye boyunca cevap beklemesini istiyorsanız onu int türünden mili saniye cinsinden girmeniz gerekiyor. Eğer istediğiniz cihazdan 3 saniye boyunca cevap gelmez ise hata vermesi ise buraya serialPort.ReadTimeout = 3000 demeniz gerekiyor.

serialPort.WriteTimeout: SerialPort sınıfının WriteTimeout isimli özelliği ise seri portunuzun yazma işlemini kaç saniye boyunca sürdürmesini istiyorsanız yine int türünden mili saniye cinsinden bu özelliği set etmeniz gerekmektedir.

Serial Port sınıfının önemli bir kaç özelliğini inceledikten sonra şimdide bir kaç tane fonksiyonlarını inceleyelim.

serialPort.DiscardInBuffer(): SerialPort sınıfının DiscardInBuffer isimli fonksiyonu seri portunuzun bufferını temizlemek için kullanılan geri dönüş değeri ve parametresi olmayan fonksiyondur. Çok sık veri alış-verişi yaptığınız sistemlerde kullanmanız gereken bir fonksiyondur. Bazen haberleşme esnasında kullanmadığınız ama portda kalan verileriniz olabilir böyle bir durumda ikinci kez veri okumaya kalktığınız da hem o önceki okumada kalan verileri hem de cihazdan gelen doğru cevabı alırsınız. Bundan dolayıda doğru veri ile işlem yapmamış olursunuz.

serialPort.DiscardOutBuffer(): SerialPort sınıfının DiscardOutBuffer isimli fonksiyonu seri portunuzun veri gönderme aşamasındaki verileri temizlemek için kullanmanız gereken geri dönüş değeri ve parametresi olmayan fonksiyonudur.

serialPort.GetPortNames(): SerialPort sınıfının static GetPortNames isimli fonksiyonu bilgisayarınızdaki kullanılabilir portların isimlerini size string dizisi şeklinde söyleyen fonksiyondur. Eğer kullanıcınıza açık olan portları söylemek istiyorsanız bu fonksiyonu kullanabilirsiniz. Şöyle ki; formunuzda bir comboBox olduğunu düşünün ve bu comboBox’ın içini kullanılabilir portların isimleri ile doldurmak istiyorsanız. Bunun için iki yol;

Birinci Yol;

for (int i = 0; i < 30; i++)
{
   try
   {
      serialport.PortName = "COM" + i.ToString();
      serialport.Open();
      comNo_cb.Items.Add(serialport.PortName);
      serialport.Close();
   }
   catch (Exception)
   { continue; }
}

En fazla 30 tane port olduğunu düşünürüz ve bu portları tek tek açıp kapatırız, eğer sorunsuz bir şekilde açılırsa demek ki bu port kullanılabilir deriz ve hemen comboBox’a ismini yazarız. Birde bunu GetPortNames ile yapalım;

comNo_cb.Items.Add(SerialPort.GetPortNames());

2. yol hepimiz için daha hayırlı bir yol gibi duruyor :).

serialPort.Open(): SerialPort sınıfının Open isimli fonksiyonu seri portunuzu açmanıza yarar. Hemen şunu söylemekte fayda var bu işlemi yapmadan önce bir hata almak istemiyorsanız port adını, baudRate’inizi belirtmeyi unutmayın. Eğer port adını belirtmez iseniz veya yanlış yazarsanız hata alacaksınız.

serialPort.Read(byte[] buffer, int offset, int count): SerialPort sınıfının Read isimli fonksiyonu seri portunuzdan veri okumanızı sağlayan bir fonksiyondur. İlk parametresi byte türünden bir dizi, ikinci parametre dizinin kaçıncı indisinden itibaren veri yerleştireceğini, son parametresine ise kaç byte veri okuyacağınızı söylemeniz gerekiyor. İlk parametre char türünden bir dizide olabilir. Fonksiyonun geri dönüş değeri ise kaç byte okunduysa onu size int türünden söyler.

serialPort.ReadByte(): SerialPort sınıfının ReadByte isimli fonksiyonu seri portdan sadece bir byte okumanızı sağlayan fonksiyon. İsmi ReadByte olmasına rağmen geri dönüş değeri int türüdür ve size okunan değeri söyler.

serialPort.ReadExisting(): SerialPort sınıfının ReadExisting isimli fonksiyonu çağrıldığı zaman seri portdan okunabilen tüm veriyi size string türünden geri döndürür.

serialPort.ReadLine(): SerialPort sınıfının ReadLine isimli fonksiyonu seri portdan NewLine karakteri gelene kadar tanımladığınız ReadTimeout süresince bekler. Gelen veriyi size string türünden geri döndürür.

serialPort.Write(): SerialPort sınıfının Write isimli fonksiyonunun 3 tipi var bunlardan biri cihaza göndermek istediğiniz veriyi string türünden göndermenizi sağlıyor;

serialPort.Write("Bu veriyi cihaza yaz");

İkinci yöntem ise veriyi byte dizisi türünden göndermenizi sağlıyor.

byte[] gidecekVeri = new byte[] {0x30, 0x31, 0x32, 0x33, 0x34};
serialPort.Write(gidecekVeri, 0, gidecekVeri.Length);

Tahmin edeceğiniz gibi ilk parametre byte türünden bir dizi, ikinci parametre ise bu dizinin kaçıncı indisinden itibaren üçüncü parametredeki değer kadar seri portdan veri göndermenizi istiyor. Birde byte dizisinin yerine char dizisi ile gönderebileceğiniz üçüncü bir tipi bulunuyor.

serialPort.WriteLine(): SerialPort sınıfının Write isimli fonksiyonu göndermek istediğiniz veriyi string türünden parametre geçerek gönderebilirsiniz. Write fonksiyonundan tek farkı göndermek istediğiniz verinin sonuna ‘\n’ karakterini ekliyor olması.

Genel olarak serialPort sınıfının fonksiyonlarını ve özelliklerini inceledik, en kısa zamanda bununla ilgili bir uygulama yapıp siteme koymayı düşünüyorum.Seriport ile uğraşan arkadaşlar için umarım faydalı olmuştur.

Görüşmek üzere, iyi çalışmalar…

 Scroll to top