C# ile Seri İletişim Aslı Ergün
if (SeriPortum.IsOpen == false) { SeriPortum.Open(); } SeriPortum.Close(); string veri = SeriPortum.ReadLine(); //Seri porttan veri okur. SeriPortum.WriteLine(veri); //Seri porta veri yazar.
Seriport Olayları private void Fonksiyonum(object s, SerialDataReceivedEventArgs e) { string veri = SeriPortum.ReadLine(); }
Seri port fonksiyonları, olayları ve özellikleri 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.
erialPort.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ı.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO.Ports; namespace Send_Receive { public partial class Form1 : Form SerialPort port1 = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One); string s = null; public Form1() InitializeComponent(); port1.Open(); port1.DataReceived += new SerialDataReceivedEventHandler(SerialReceive); // port1.ReadTimeout = 5000; // 5000ms } public void SerialReceive(object sender, SerialDataReceivedEventArgs e) s += port1.ReadExisting(); private void Write_Click(object sender, EventArgs e) port1.WriteLine("*IDN?"); private void Read_Click(object sender, EventArgs e) // s += port1.ReadExisting(); textBox1.Text = s;