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.