Merhabalar, C# Seri Port RS232 Veri Okuma yazım ile C# eğitim setine devam ediyorum. Bu yazıda sadece seri porta (com) bağlanarak gelen veriyi okuma işlemi yapacağız. Yani seri porta veri yazma işlemine bu yazıda değinmeyeceğim. Seri port cihazım olmadığı içinde nasıl çalıştığını gösteremeyeceğim. Bu sebeple sadece kodları olacak. Gelin seri port rs232 okuma işlemini nasıl yaptığımıza bakalım.
Good Stuff Happens in 1:1 Meetings: Why you need them and how to do them well
C# Seri Port RS232 Veri Okuma
1. Mustafa BÜKÜLMEZ https://mustafabukulmez.com/
https://mustafabukulmez.com/2021/05/06/c-seri-port-rs232-veri-okuma/ ~ 1 ~
Merhabalar, C# Seri Port RS232 Veri Okuma yazım ile C# eğitim setine devam ediyorum.
Bu yazıda sadece seri porta (com) bağlanarak gelen veriyi okuma işlemi yapacağız. Yani seri
porta veri yazma işlemine bu yazıda değinmeyeceğim. Seri port cihazım olmadığı içinde nasıl
çalıştığını gösteremeyeceğim. Bu sebeple sadece kodları olacak. Gelin seri port rs232 okuma
işlemini nasıl yaptığımıza bakalım.
C# Seri Port RS232 Veri Okuma
Giriş kısmında belirttiğim gibi sadece seri port rs232 veri okuma yapacağız. Veri yazma işine
hiç ihtiyacım olmadığı için hiç kullanmadım dolayısı ile o kodları veremeyeceğim. İnternetten
bakıp yazabilirim böyle diye ama prensip meselesi çalıştığını görmediğim kodları
paylaşmıyorum.
Ayrıca bu porta Com Port 'ta denebilmektedir. Com, communication yani haberleşmeden
geliyor. Bilgisayarımızdaki Com Portlar otomatik olarak genellikle COM1, COM2 şeklinde
isimlendirilmiş olur.
Seri port'u bilmeyen arkadaşlar için, seri port aşağıdaki gibi VGA'ya benzeyen ama iki sıra
pini olan bir prottur ve genellikle kantar ve terazilerden veri alırken kullanırız.
Burada şuna bir ayrım getirelim. Seri Port ile RS232 aynı şeyler değillerdir arkadaşlar. Seri
Port yukarıda gördüğünüz görseldeki gibi bağlantısı olan bir bağlantı şeklidir. RS232 ise
Telekomünikasyonda RS-232, DTE ile DCE arasındaki seri ikili tek sonlu veri iletimi ve
sinyalleme için kullanılan seri iletişim standardının genel adıdır. Bu konu hakkında daha
detaylı bir yazı ileride yapabilirim.
C# Seri Port RS232 Veri Okuma
2. Mustafa BÜKÜLMEZ https://mustafabukulmez.com/
https://mustafabukulmez.com/2021/05/06/c-seri-port-rs232-veri-okuma/ ~ 2 ~
İlk işimiz her zamanki gibi bir class açmak olacak. Ben adına RS232_Connect diyorum. Siz
istediğiniz ismi verebilirsiniz. Sonrasında Seri Port ile çalışmak için projemize
using System.IO.Ports;
Namespace 'ini (isim uzayı) eklememiz gerekiyor. Namespace'i ekledikten sonra
public static SerialPort comPort = new SerialPort();
diyerek seri port tanımlamasını yapıyoruz.
Bilgisayardaki mevcut com portların bir listesini alalım.
public static string[] ports = SerialPort.GetPortNames();
Sonrasında seri port veri okuma hızını belirteceğimiz baud rate'leri hazırlıyoruz.
private static int[] brate = new int[] { 2400,4800,9600,19200,38400 };
Baud rate tanımı veri iletim hızı olarak bilinir ve genellikle 9600'dür. Şahsen 9600'dan başka
bir baud rate kullanmadım. Büyük ihtimalle hep terazi kantar gibi cihazlardan veri okuduğum
içindir. Ek olarak burada cihazımızın desteklediği hızları bilmemiz gerekiyor. Bilmiyorsak
hızları tek tek deneyerek sağlıklı veri aldığımız hızı bulabiliriz.
Seri Port Bağlantısı
Eğer sürekli baud rate ve com port değiştirmeye gerek yok ise yani geliştirdiğiniz uygulama
için alınan cihazların hepsi aynı ise yukarıdaki dizileri kullanmanıza gerek yoktur. Ben
uygulamalarımda hiç değiştirme gereği duymadım. Seri Port adını (COM1, COM2 vs ) adını
ve baudrate'ini bildiğim için hep sql tablosunda tutarım bu bilgileri. Parametre şeklinde okur
ve kullanırım.
Sıra geldi bağlantımızı açmaya... Öncelikle bağlantı açık ise kapatacağız. Kapalı ise açacağız.
public static void PortOpen(string port_name, int baudrate)
{
if (comPort.IsOpen) comPort.Close();
if (!comPort.IsOpen)
{
try
{
3. Mustafa BÜKÜLMEZ https://mustafabukulmez.com/
https://mustafabukulmez.com/2021/05/06/c-seri-port-rs232-veri-okuma/ ~ 3 ~
comPort.PortName = port_name;
comPort.BaudRate = baudrate;
comPort.Open();
comPort.Handshake = Handshake.None;
}
catch (Exception ex)
{
MessageBox.Show(ex.GetType().Name + Environment.NewLine
+ ex.Message);
}
}
}
Buraya kadar ki kısmı bir class dosyası içindedir. Bir çok deneme yapmama rağmen veriyi
sürekli olarak okuyan kodları class'ta kullanamadım. Buradan sonra vereceğim kodlar ilgili
formların içerisinde yer almaktadır.
Diyelim ki KantarForm adında bir formumuz olsun ve teraziden gelen KG bilgisini bu
ekranda bir nesneye yazacak olalım. KantarForm'umuzu açıyoruz ve Load eventinde seri port
bağlantısını açıyoruz. Portu açtıktan sonra da verileri alacak olan eventimizin atamasını
gerçekleştiriyoruz.
Cls.Global.RS232_Connect.PortOpen("COM1",9600);
Cls.Global.RS232_Connect.comPort.DataReceived += new
SerialDataReceivedEventHandler(comPort_DataReceived);
Bu iki satır kod seri port bağlantısını ne zaman başlatacaksanız orada kullanabilirsiniz.
Verileri Okumak
Portu açtık ve dinlemeye başladık. Şimdi bir string değişken tanımlıyoruz. Ben bu değişkene
Gelen adını verdim. Değişkeni tanımladıktan sonra DataReceived eventi tanımlıyoruz.
public string Gelen = "";
private void comPort_DataReceived(object sender,
SerialDataReceivedEventArgs e)
{
try
{
Gelen = Cls.Global.RS232_Connect.comPort.ReadLine();
}
catch (System.IO.IOException) { Gelen = ""; }
catch (InvalidOperationException) { Gelen = ""; } // bağlantı
kapalı olduğunda çıkıyor
try { base.Invoke(new EventHandler(this.DisplayText)); }
catch (FormatException) { } // hatalı format
catch (InvalidOperationException) { } // Pencere işleyicisi
oluşturuluncaya kadar denetim üzerinde Invoke veya BeginInvoke çağrılamaz.
catch (IndexOutOfRangeException) { } // Dizin, dizi
sınırlarının dışındaydı.
}
4. Mustafa BÜKÜLMEZ https://mustafabukulmez.com/
https://mustafabukulmez.com/2021/05/06/c-seri-port-rs232-veri-okuma/ ~ 4 ~
Buradaki kodları biraz açıklamam gerekiyor. Öncelikle neden direk textbox'a veya başka bir
nesneye yazmıyoruz derseniz bu metot içerisinde textbox vb. bir nesneye atama
yapamıyorsunuz. Özellikle veriyi değişkene almak ve DisplayText gibi farklı bir metot ile bir
nesneye yazabiliyorsunuz.
private void DisplayText(object sender, EventArgs e)
{
calc_miktar.EditValue =
RS232_Connect.Gelen_Bilgi_Formatlama(Gelen);
}
Burada gördüğünüz gibi ReadLine() metotu ile gelen veriyi satır olarak okuduk ve gelen
veriyi bir değişkene aldık. Bu işlemi yaparken iki farklı hata alabiliyoruz. Program kırılmasın
diye bu hataları try catch ile ele aldım ve umursama devam et dedim.
Verileri almakla bitmiyor. Alınan veriyi de bir yere yazmamız gerekiyor. Yazma işlemi içinde
DisplayText eventimizi kullanıyoruz. Yine aynı event yani veri okuma eventi içerisindeyiz.
Başka bir bir kaç try kontrolü ile DisplayText adlı eventimizi tetikletiyoruz. Burada da bir kaç
hata alabildiğimiz durumlar olduğu için o hataları da umursama diyoruz.
Try Catch 'ı burada ve burada anlattım
NOT: comPort_DataReceived metodu sürekli çalışıyor arkadaşlar. Yani bir timer nesnesi
gibi sürekli portu dinleyerek oradan gelen bütün verileri alıyor.
Son olarak DisplayText eventi içerisindeki Gelen_Bilgi_Formatlama metodu da çok önemli
değil. Çünkü terazi gibi cihazların çoğundan sadece Kg bilgisi gelmiyor. Dara bilgisi vs gibi
bir çok veri gönderdikleri için içerisinden sadece KG kısmını almak gerekiyor. Bu sebeple de
gereksiz verileri temizlemek gerekiyor. Formatlamayı bu sebeple kullanıyorum. Tabi ki bu
hazır bir kod değil. Onu da siz yazacaksınız.
C# Seri Port RS232 Veri Okuma yazımda bu kadar arkadaşlar.
Bu kodları bir çok projemde teraziden veri okuma amacı ile aktif olarak kullanıyorum. Yani
çalıştığından %1000 eminim :D
Diğer yazılarımda görüşmek üzere. Umarım faydalı olmuştur. Aşağıdaki linklerden eğitim
seti sayfasına ve github projesine ulaşabilirsiniz. C Sharp Eğitim Seti eğitimi sayfasına
gitmek için tıklayınız. Derslerime özel olarak hazırladığım Github Projeme buradan
ulaşabilirsiniz… Ayrıca bu yazının PDF'ine buraya ve ya buraya tıklayarak ulaşabilirsiniz.
Sağlıcakla ve kodla kalın....