C Sharp İle Seri Port Kullanımı

Merhaba arkadaşlar, bu dersimizde C# ile seri port kullanımını detaylı olarak anlatmaya çalışacağız. C# ile string, byte ve char türü veri gönderip alma işlemlerini inceleyeceğiz. Ayrıca seri porttan otomatik veri okuma işlemini öğreneceğiz.

Öncelikle seri port nesnesini kullanabilmek için, System IO Ports kütüphanemizi projemize dahil ediyoruz. Bunun için sayfamızın en üst kısmına using System.IO.Ports;  kodunu ekleyerek derleyiciye giriş çıkış portlarını kullanacağımızı bildiriyoruz.

Seri port nesnesini kullanabilmek için öncelikle bir seri port oluşturuyoruz;

Yukarıda verdiğimiz kodları inceleyelim;

PortName : Seri port adını belirtir. String türü değer alır. Bilgisayarınızda bağlı olan seri portları aygıt yöneticisinden görebilirsiniz. Port adı kesinlikle belirtilmeli.

BaudRate : Seri haberleşme hızını belirtir. int32 türü değer alır. Bir saniyede gönderilebilecek maksimum bit sayısıdır. Alıcı ile aynı değer almak zorundadır. Standartlaşmış olarak 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 değerlerini alabilir. Varsayılan değeri 9600 Baud’dur.

DataBits : Gönderilecek her bilgini/karakterin kaç bitten oluşacağını belirtir. int32 türü değer alır. 5 ile 8 arasında değer alabilir. Genelde 7 ve 8 değerini alır. Varsayılan değeri 8’dir.

Parity : Eşlik bitinin sayısını belirtir. Alınan verinin doğruluğunu kontrol etmek için kullanılır. None (0), Odd (1), Even (2), Mark (3), Space (4) değerlerini alabilir. Varsayılan değeri None ‘dur.

StopBits : Durdurma bitinin kaç bit olacağını belirtir. One (1), Two(2), OnePointFive(3) değerlerini alabilir. Varsayılan değeri One ‘dır.

Seri portu tek satır kod ile oluşturabiliriz;

Bilgisayarımızdaki tüm seri portları bir combobox’da listelemek için SerialPort nesnesinin GetPortNames özelliğini kullanarak portları bir diziye atarız. Ardından diziye atadığımız string türündekiport adlarını bir foreach döngüsü yardımı ile combobox’ta listeleyebiliriz;

 

Seri port nesnesini tanımladıktan sonra veri gönderip alabilmek için seri portumuzu açmamız gerekiyor. Bunun için Open() fonksiyonunu çağırıyoruz. Eğer seri port başka bir cihaz tarafından kullanıyorsa portumuz açılmayacaktır. Çünkü bir seri port aynı anda bir uygulama ya da bir cihaz tarafından kullanılabilir.

 

Seri Port Veri Gönderme :

Seri porta veri göndermek için Write() fonksiyonu kullanılır. Gönderilen veri String, Byte dizisi ya da Char dizisi olabilir. String türü veri göndermek için parantezler içerisinde Çift tırnak içerisinde gönderilecek veri yazılır.

Örnek:

 

Byte ya da Char dizisi göndermek için ise parantezler içerisinde dizi değişkeni, gönderilecek dizinin başlangıç indisi, ve dizide gönderilecek indis sayısı yazılır.

Seri port Byte dizisi gönderme örnek:

 

Seri port Char dizisi gönderme örnek:

 

Seri Port Veri Okuma :

Bu konuda bir çok kişi sıkıntı yaşamaktadır. Seri port sadece açık olduğu zaman veri alabilir. Bir timer yardımıyla sürekli seri port kontrol edilebilir yada seri portun DataReceived eventi ile seri port dinlenebilir. Timer kullanarak seri porttan alınan veride kayıp yaşanma ihtimali yüksektir. Bu sebeple biz DataReceived eventini kullanacağız.

Bunun için öncelikle DataReceived eventini tanımlamamız gerekiyor.

 

Ve ardından fonksiyonumuzu yazıyoruz:

Bu event içerisinde seri porttan gelen bilgileri otomatik olarak okuyup bir değişkene aktarabiliriz ya da textBox, listBox gibi araçlara yazdırabiliriz. Birkaç çeşit okuma şeklimiz vardır.

1- ReadExisting() fonksiyonu ile String olarak okumayı görelim;

 

2- ReadLine() fonksiyonu ile yine Strig türünde satır satır okuma;

 

3- Read() fonksiyonu ile Byte dizisi olarak okuma:

Read() fonksiyonu ile byte dizisi gibi char dizisi şeklinde de okuma yapabiliriz.

 

4- ReadByte() ve ReadChar() fonsiyonları ile bir byte ve bir char veri okuma:

 

Diğer Seri Port Fonksiyonları:

  • Close(); Seri portu kapatır.
  • ReadTimeout; Okuma zaman aşımını ayarlar. Milisaniye cinsinden değer alır.
  • WriteTimeout; Yazma zaman aşımını ayarlar. Milisaniye cinsinden değer alır.
  • DiscardInBuffer(); Gelen veri hafızasını temizler.
  • DiscardOutBuffer(); Giden veri hafızasını temizler.
  • IsOpen; Seri portun açık ya da kapalı olduğu bilgisini verir. True ya da False olarak bool cinsinden iki farklı değer döndürebilir.
  • DtrEnable; Seri port DTR pinini aktif ya da pasif yapmak için kullanılır. Bool cinsinden True ya da False olmak üzere iki farklı değer alabilir. DTR pini cihazlar arası elsıkışma da denilen, cihazın veri almaya hazır olduğunu bildiren pindir.
  • RtsEnable; Seri port RTS pinini aktif ya da pasif yapmak için kullanılır. Bool cinsinden True ya da False olmak üzere iki farklı değer alabilir. RTS pini cihazlar arası elsıkışma da denilen, cihazın veri göndereceğini bildiren pindir.

Github üzerinden yayınladığım örnek seri port uygulamasına buradan erişebilirsiniz: C# Seri Port Örnek Uygulaması

Yorum Yap

  • Murat
    5 yıl ago  

    Merhaba; C# Formunda 2 adet çift tabanlı veri var. (Örn; A Sayısı : 25, B Sayısı 34). Bu verileri Arduino ile Seri Port bağlantısını yapar yapmaz yani gönder butonuna basmadan anında yazdırmak istiyorum. Nasıl yapabilirim yardımcı olabilir misiniz?

    • 5 yıl ago  

      Merhaba.
      Seri porta veri gönderebilmek için ilgili seri port seçili olması ve ayarları yapılmış olması gerekir. Tüm ayarları yaptığınızı varsayarak:
      Eğer seri porta verileri belli aralıklarla gönderecekseniz timer kullanmalısınız.
      Yok eğer verileri bağlantıdan sonra yalnızca 1 defa gönderecekseniz, serialPort.Open() komutundan sonra veri gönderme komutunu yazabilirsiniz. En azından Formda bir port seçmek için ComboBox ve bağlantı kurmak için Bağlan butonunuz olması gerekir. Bağlan butonunun Click eventi içerisinde veri gönderecek ya da Timer’ı başlatacak kodu yazabilirsiniz.

  • Erdim
    5 yıl ago  

    Merhaba , bu kaynak benim adıma çok iyi oldu çok bilgi aldım. Amacım USB bağlantısı ile 18F sürümü bir PIC Mikrodenetleyiciye veri alıp göndermek. Örneğin PIC den anlık olarak sıcaklık bilgilerini alıp C#’da hazırladığım formda anlık olarak görmek ve aynı zamanda PIC e komut da verebilmek istiyorum. C#’ da program hazırlıyorum. Bu yazınızdaki bilgiler bunları yapabilmeme yeterli midir acaba? Çok teşekkür ederim bilgileriniz için…

    • 5 yıl ago  

      Merhaba
      Eğer 18F serisi denetleyici ile USB D+/D- pinleri üzerinden haberleşme sağlayacaksanız, bu makaledeki bilgiler işinizi görmez.
      Eğer USB – Seri port çevirici ile Rx/Tx pinleri üzerinden haberleşme sağlayacaksanız, buradaki bilgiler ile programlama becerinize bağlı olarak dilediğinizi yapabilirsiniz. C# ve PIC programlama beceriniz ne kadar bilmiyorum. Buradaki bilgiler ile, PIC ile PC arasında yalnızca veri alışverişi yapabilirsiniz. Geri kalanı sizin programlama becerilerinizie bağlıdır. Çünkü veri alıp gönderme en basit iştir, zor olan kısım veriyi kullanabilmektir.

  • Emir
    4 yıl ago  

    Merhaba port isimlerini combobox eklemiyor niye olabilir acaba

    • 4 yıl ago  

      Merhaba.
      Seri Portların Comboboxta listelenebilmesi için bilgisayarınızda en az bir seri port bağlı olması gerekmektedir.
      Portları listelemek için “Yenile” adında bir buton ve “PortListele” adında bir metod (fonksiyon) oluşturun. Ardından bu fonksiyon içerisine port listeleme kodlarını yazın. Form load metodu içerisinden ya da Yenile butonu click eventi içerisinden bu fonksiyonu dilediğiniz zaman çağırabilirsiniz.
      Örnek:

      void PortListele(){
      comboBox1.Items.Clear(); // Combobox içeriğini temizledik
      string[] portlar = SerialPort.GetPortNames(); // Bağlı seri portları diziye aktardık
      foreach(string portAdi in portlar){
      comboBox1.Items.Add(portAdi); // Dizideki portları ComboBox’ta listeledik
      }
      }

      Artık bağlı portları listelemek için PortListele() fonksiyonunu çağırmanız yeterli

  • seyda
    4 yıl ago  

    merhaba. arduino da butona her basıldığında 1 artan sayacı c# ta label a nasıl aktarabilirim?

    • 4 yıl ago  

      Merhaba,
      C# üzerinde seri port ayarlarını yaptığınızı varsayıyorum.
      Yukarıda bahsettiğim gibi önce bir evet oluşturacağız;
      serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);

      Ardından olay tetiklendiğinde çalışacak kodlarımızı yazacağız;

      private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
      {
      label1.Text = serialPort1.ReadExisting();
      }

      Arduino ile sayaç değerini Serial.print(sayac); şeklinde seri port gönderdiğinizde sayaç değeri label1 üzerinde görüntülenmiş olacaktır.

  • Metin
    4 yıl ago  

    İlk başta Türkçe kaynak bulamam diye yabancı sitelerde epey dolaştım, istediğim şeyi bulamadım. Sizin örnek ile (özellikle GitHub üzerindeki) 1 gecede tam olarak istediğimi yaptım, daha önce hiç C# veya masaüstü uygulama yapmamıştım.

    Uygulamada yaptığım değişiklikler; tek bir giriş alanı yerine 1’den fazla giriş alanı oluşturdum, bir de her gönder butonuna basınca artan bir text alanı ekledim. Verileri gönderince her alan verisinin arasına delimiter koyup o şekilde gönderiyor.

    çok faydalı oldu, teşekkür ederim.

  • ertuğ
    4 yıl ago  

    teşekkür ,
    sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived); bu kısımdaki += anlamı nedir?

  • Yiğit
    3 yıl ago  

    Elinize, emeğinize sağlık hiçbir yerde bulamadığım uygulamayı ve açıklamayı burda buldum. Çok teşekkürler.