BilgeYazilim.NETOnline UlaşımİletişimHakkında
Ana Sayfa arrow Makaleler-Yayınlar arrow Visual C#.NET ile Seri Haberleşme 1
MENÜ
Ana Sayfa
Makaleler-Yayınlar
Kitap Tanıtımları
Dergiler
Teknolojiden Haberler
Program Tanıtımları
- - - - - - - - - - - - - - - - - - - - - -
Görüş ve Önerileriniz
Gazeteler
- - - - - - - - - - - - - - - - - - - - - -
SUDOKU Oyna
- - - - - - - - - - - - - - - - - - - - - -
.: En Çok Okunanlar :.
Visual C#.NET ile Seri Haberleşme 1 PDF Yazdır E-Posta
Yazan Bilgehan ŞAHİN   
Çarşamba, 15 Şubat 2006
     Bu konumuzda Visual C#.NET ile seri haberleşme üzerinde durmak istiyorum. Olayımız aslında çok basit. Fakat iş haberleşme kelimesinde bittiği için ilk izlenimi biraz korkutabilir. Şu an için sadece temel komutlar üzerinde durmak daha faydalı olacak sanırım.

       Bu konumuzda Visual C#.NET ile seri haberleşme üzerinde durmak istiyorum. Olayımız aslında çok basit. Fakat iş haberleşme kelimesinde bittiği için ilk izlenimi biraz korkutabilir. Şu an için sadece temel komutlar üzerinde durmak daha faydalı olacak sanırım.

     .NET 2003’te seri haberleşme ile  ilgili bir component olmadığı için çeşitli yöntemler kullanarak ancak yapabiliyorduk. Fakat son sürümü olan .NET 2005’te bununla ilgili bir component koymuşlar. SerialPort componenti.  Seri haberleşmenin temeli üzerinde durmak istemediğim için onu sizlere bırakıyor ve hemen örneğimize girmek istiyorum.           

      Bir tane Visual C# uygulaması başlatalım. Amacımız şimdilik sanki seri portumuza PLC, PIC veya başka bir cihazın takılı olduğunu düşünerek buna yönelik basit bir işleyiş olacak. Furmumuzun üzerine bir tane SerialPort, bir tane TextBox ve Buton ile bir tanede ListBox ekleyelim. Butona yazılacak olan kodlar TextBox taki veriyi seri porta gondermek olacak. Gelen verileride ListBox’ımıza ekleticez.

    

 

        SerialPort componenti ile ilgili ayarları defoult ayarlarda bırakıyoruz. Bunları daha sonra ayrıntılı biçimde tekrar görücez.  Daha sonra kod kısmıca geçip öncelikle aşağıdaki kütüphaneleri ekleyelim. 
using System.IO.Ports;     // Seri haberleşme içinusing System.Threading;   // Kanal prosedürleri için gerekli                                kütüphaneletimiz.

       Şimdide seri port işlemlerimizin çalışması için Form1_Load’ına yazacağımız kod ile portumuzu açalım. 

private void Form1_Load(object sender, EventArgs e)        {            if (serialPort1.IsOpen == false)     //Burada SerialPort'u                                                  // kontrol ediyoruz.            {                                    //Akış için önce portu                 serialPort1.Open();              //açmamız gerekiyor                                                                                                   //Bu komut seri portu              }                                    //açmada kullanılır        }

  Daha sonrada porta veri göndermek için gerekli kodları yazalım.

privatevoid button2_Click(object sender, EventArgs e)        {          serialPort1.WriteLine(textBox1.Text); //Porta veri gönderen komut.         }

         C# ta seri porta verimizi göndermek için kullanacağımız kod “SerialPort1.WriteLine “ dır. Bu kodda dikkat ederseniz parantezler arasına gönderilen veriyi string formatta textBox1 in Text’inden aldık.  Şimdi artık textBox1 in içerisine yazdığımız bir veriyi rahatlıkla seri porta gönderebiliriz. Ardından gelen veriler için gerekli kodumuzu yazalım.   .NET 2005 bu olayı biraz değiştirerek bize sunmaktadır. Gelen verilerden biz SerialPort’un DataReceived eventi ile haberdar oluyoruz. Porta gelen herhangi bir veri akışında bu olay tetikleniyor. Bizede geleni alıp işlemek kalıyor:    Global olarak sabitlerimizi tanımlayıp serialPort1.DataReceived’ine aşağıdaki kodu ekleyelim.        

        delegate void SetTextDelegate(string del);  private string gelenverim;  Thread kanal;  //Kanal açıyoruzki gelen veriyi çekelim.

  

    privatevoid serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)        {            gelenverim = Convert.ToString(serialPort1.ReadExisting());      //Gelen veriyi okuyup string değişkenime atıyorum.            this.kanal = new Thread(new ThreadStart(this.veriisle));            this.kanal.Start();   }

       Burada porta gelen verimi ReadExisting ile okuyup değişkenime atıyorum. Sonrada veriisle prosedurumu kanal ile ilişkilendiriyorum ve kanal’ımı açıyorum.  Şimdi aşağıdaki prosedürümüzü yazalım.

    private string gonder;        private void veriisle()        {            while (true)            {                gonder = gelenverim;                this.kanalprosedur(gelen.ToString());            }   }

Ve ardından devamını yazalım

privatevoid kanaliislet(string gonderilen)        {            if (this.InvokeRequired)                {                    SetTextDelegate yeni = new SetTextDelegate(kanalprosedur);                    this.Invoke(yeni, new object [] { gonderilen });                }                else                {                    // Sonuç bölümü. işlemesi gereken kodlarımızı yazacağımız yer                    listBox1.Items.Add(gonderilen);                }        }

      Burada yapılan olay farklı kanal çalışmaları olduğu için işin içine delegeleri sokarak Cross Thread olayını gerçekleştirmek oldu. Farklı bir kanalda bulunan veriyi (seri porttan velen) kendi kanalıma aldım.         En son olarak ta Form1_Closed 'a portumuzu kapatan kodu yazdığımız zaman işimiz bitiyor. Onun kodu da         serialPort1.Closed();  Evet arkadaşlar, olay yabancı olanlar için biraz karışık. Bunu kabul ediyorum. Fakat kullanılan kodlar her yerde aynı olacağı için başınız fazla ağrımicaktır. 

 
< Önceki   Sonraki >
Copyright © 2005 - 2008   |   Design by BilgeYazilim.NET