Bu yazıya başlamadan önce C# kullanımını hızlı ve faydalı bir şekilde öğrenmek için aşağıdaki linkte bulunan dört Tutorial’ı anlatımıyla birlikte yapmanızı tavsiye ederim.
http://msdn.microsoft.com/tr-tr/library/dd492171
Eğer temel C# Windows Forms Application yapmayı biliyorsanız buna ihtiyaç duymayacaksınız. Öncelikle C#’ta SerialCommunication adında bir proje oluşturalım. Bunun için File > New >Project… yolunu takip ediyoruz. Karşımıza New Project adında bir pencere çıkıyor. Installed Templates’in içinden Visual C# ardından da orta kısımdan Windows Forms Aplication’ı seçiyoruz. Name kısmına önceden belirlediğimiz gibi “SerialCommunication” yazıyoruz. Location’ı belirledikten sonra OK seçenegine tıklayıp, yeni projemizi oluşturuyoruz. Şimdi karşımıza Form1 isminde bir form çıktı.
Form1’in üzerine çift tıklayınca kod kısmında
1 |
private void Form1_Load(object sender, EventArgs e) { } |
diye bir method oluştuğunu görmelisiniz çünkü ilerde burayı kullanacağız. Ardından tekrar Form1.cs[Design] kısmına geçip GUI’ mizi tasarlamaya başlıyoruz. Yapacağımız programı basit tutmak için mümkün oludukça az component kullanmak istiyorum. Form1 seçiliyken Properties > Text kısmının içine SerialCommunication diye yazınca programımızın ismini değiştirmiş oluruz.
Toolbox > Containers’tan TableLayoutPanel’a çift tıklıyorum ve ardından tableLayoutPanel1 oluşuyor ve bu seçiliyken Properties’ten Dock’u Fillyapıyorum. 2 satır 2 sütundan oluşan bir container oluşturmuş olduk. Toplamda 2*2=4 tane dikdörtgen oluştu. Bu demek oluyor ki her bir dikdörtgene yalnızca 1 component yerleştirebilirim. TableLayoutPanel’in özelliği de bu zaten. Eğer her bir dikdörtgenin içine birden fazla component koymak istiyorsanız bu dikdörtgenlerden içinde fazladan component istediğiniz dikdörtgene FlowLayoutPanel sürükleyip bırakabilirsiniz.FlowLayoutPanel’de sığdırılabilecek kadar componenti yer varsa satır boyunca, satır boyunca yer kalmadıysa da sütun boyunca componentleri yerleştirmenize olanak sağlayan bir paneldir. Öncelikle bize gerekli olan componentleri belirleyelim.
- Toolbox > Components > SerialPort’a çift tıklayarak GUI’mize bir SerialPortcomponenti ekliyoruz. Design kısmında altta serialPort1 diye gözükmesi gerekir. serialPort1 seçiliyken Properties > Events > DataRecieved’e çift tıklıyoruz. Bize aşağıdaki methodu oluşturuyor. Gelen dataları okuyabilmemiz için bu event handler’ı kullanmamız gerekecek.
1private void serialPort1_DataReceived(object sender,SerialDataReceivedEventArgs e) { } - SerialPort’tan String gönderebilmem için öncelikle bir tane TextBox eklemem gerekir. Bunun için TextBox’ı koymak istediğimiz yere sürükleyip bırakmamız yeterli.
- Send işlemini yapabilmemiz için bir Button’a ihtiyacımız var.
- Gelen giden yazıları okumak için RichTextBox’a ihtiyacımız var.
- Serial iletişimi yapmak için bu iletişimi yapacağımız COM portu seçmemiz gerekir. Port isimlerinin bulunacağı bir Combo Box oluşturmamız lazım.
- Baudrate’i ayarlamamız için gerekli Baudrate’leri bir Combo Box’ın içine eklememiz gerekir.
- Seçilen Baudrate ve Port’tan iletişime başlamak için Connect Button’u yerleştirmemiz gerekir.
- Baudrates ve Port Names isminde iki tane Label’ı ilgili Combo Box’ların üzerine yerleştirelim.
Şimdi GUI mizi oluşturabiliriz. 2×2 TableLayoutPanel’imizin 1.1 (1. satır 1. sütun)’e FlowLayoutPanel koyup, FlowLayoutPanel’in içine de 2 Combo Box ve 1 Button’u alt alta koyuyoruz. 1.2’ye RichTextBox koyuyoruz. 2.1’e 1 Button ve 2.2’ye Text Box koyuyoruz. Kaba taslak aşağıdaki resimde görüldüğü gibi bir GUI’mizin olması yeterli.
Burdan sonra kod’lama kısmına geçiyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO.Ports; // SerialPort objesini kullana bilmek için gerekli namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } // Form açılınca yapılacak ilk işlemler private void Form1_Load(object sender, EventArgs e) { // Eğer serialPort1 önceden açılmıssa sorun çıkmaması için kapatıyoruz. if (serialPort1.IsOpen) serialPort1.Close(); // Tüm Port isimlerini Combo Box'a ekliyoruz. foreach (String portNames in SerialPort.GetPortNames()) comboBox1.Items.Add(portNames); // Gerekli baudrate değerlerini bu şekilde giriyoruz. Ben 115200 ile haberleşeceğim için bunu yazdım. comboBox2.Items.Add(115200); } private void button1_Click(object sender, EventArgs e) { // Connect Button'u serialPort1.PortName = comboBox1.SelectedItem.ToString(); serialPort1.BaudRate = (int)comboBox2.SelectedItem; serialPort1.Parity = 0; // Parity'i buradan none olarak ayarladım. serialPort1.DataBits = 8; // Databits'i de 8 bit olarak ayarladım. // Eğer farkli bir şeye ihtiyaç duyulursa serialPort1. dedikten sonra // kullanılabilecek özellikler arasında ihtiyacınız olanı seçip // ayarlayabilirsiniz. serialPort1.Open(); // Serial Haberleşmeyi başlatıyoruz. richTextBox1.Text += "Connected PortName: " + serialPort1.PortName + " Baudrate: " + serialPort1.BaudRate + "n"; } private void button2_Click(object sender, EventArgs e) // Send Button'u { // Ben veri gönderimini char şeklinde bir bir göndereceğim için textBox1in // içindeki texti ToCharArray() methoduyla char dizisine dönüştürdüm. char[] charArray = textBox1.Text.ToCharArray(); richTextBox1.Text += "Transmitted Data > " + textBox1.Text +"n"; // charArray'in içindeki bütün charlar Write() methoduyla gönderilmesi. for (int i = 0; i < charArray.Length; i++) serialPort1.Write(charArray[i].ToString()); textBox1.Text = ""; // textBox1'i boşaltıyoruz. } private void serialPort1_DataReceived(object sender,SerialDataReceivedEventArgs e) { richTextBox1.Text += "Recieved Data > " + serialPort1.ReadLine() + "n"; // gelen data'ları richTextBox1 de göstermemizi sağlıyor. // ReadLine() methoduyla gelen her satırı okuyoruz. } } } |
Böylece hem C# ‘ta GUI yapmayı hem de işimizi görecek bir USB Serial Haberleşme Programı yapmayı öğrendik. İnşallah faydalı olmuştur. Herkese iyi çalışmalar dilerim. Anlaşılmayan noktaları yorum kısmında sorabilirsiniz.
bluetootla bağlanmadıkça com portları çekemiyorum. Fakak usb ile bağlanmam gerekiyor. Nasıl bağlayabilirim?
Kullandığın işlemci, yapmak istediği sistem, kullandığın entegreler ve amaçladığın proje hakkında biraz daha detay verebilirsen yardımcı olmaya çalışabilirim.
abi öncelikle güzel bir yazı olmuş teşekkürler ama bunu sanki usb için değil de rs232 den haberleşmek için yazmışsınız gibi bana mı öyle geldi acaba…çünkü hiç doğrudan usb ile alakası yokmuş gibi duruyor.
Teşekkür ederim. Usb de RS232 de seri haberleşme için kullanılır. RS232 entegreleriyle UART USB ye çevrilebilir. Aralarındaki tek fark çıkış konnektörleridir. Ben de böyle bir çevirici modül kullandım. Bu linkteki modül gibi:
http://www.wvshare.com/product/FT232-USB-UART-Board-mini.htm
Bu program doğrudan USB için de kullanılabilir ama. Sonuçta seri haberleşme. Mikroişlemcinin içinde eğer RS232 çevirici yoksa UART portlarindan USB CDC diye kütüphane kullanılabilir.
Bahsettiğim her iki durum için de bu program kullanılabilir.
Bi de merak ettim. Usb ile alakası varmış gibi durması için nasıl olması gerekiyor sence ☺
Mesela burda pic18f4550 nin b portun daki 8 ledi yakan c# programı yazılmış ve burada usbhidport v.s gibi komutlar var yani usbyi doğrudan ilgilendiren ve doğrudan kullanıldığı komutlar..ayrıca evet usb de bir seri iletişimdir ama rs-232 deki olduğundan çok daha kompleks ve derin bir konudur çeviricilerle belki bu iş yapılabilir ama bu da usb nin potansiyelini sınırlar…demek istediğim usb ile alakası varmış gibi durması için serialport konfigürasyon komutları değilde yukarıda yazdığım gibi direkt olarak usb konfigürasyon komutları olmalıydı ama tek bir tane bile göremedim o yüzden böyle yazdım : )
Usb bir çok şekilde mikroişlemci ile haberleşebilir. Senin paylaştığın kodda HID yani human interface device class’ı kullanılmış. Bu mikroişlemci tarafında yazılımsal olarak biraz daha zahmetli. Wikipediadan bakarsan mouse, klavye, oyun kumandası gibi uygulamalarda kullanılan bir yöntem. Benim kod ise serial port kullanılarak yapılmış bir uygulama. Uart ile haberleşme yöntemlerinden biri. Sonuçta seri haberleşme.
Ayrıca USB OTG olarak da kullanılabilir. Uygulamaya göre değişik metotlar kullanılabilir.
Aşağıdaki linkleri incelemeni tavsiye ederim.
http://en.m.wikipedia.org/wiki/USB_human_interface_device_class
http://en.m.wikipedia.org/wiki/USB_On-The-Go
http://en.m.wikipedia.org/wiki/Serial_communication
http://en.m.wikipedia.org/wiki/USB
http://en.m.wikipedia.org/wiki/Uart
İyi çalışmalar.
teşekkürler size de iyi çalışmalar…güzel bir siteniz var başarılar.
adamsın adam
selam, verileri illa ki
private void serialPort1_DataReceived(object sender,SerialDataReceivedEventArgs e) {
richTextBox1.Text += “Recieved Data > “ + serialPort1.ReadLine() + “n”;
bu şekilde mi çekmemiz gerekiyor? direk timerle bir periyot ayarlasam ona göre çekse, önce veri gönderse ve cevabını o verinin sonucuna göre alsa olur mu? bu eventi kullanmak zorunlu mu?