C# ile Seri Port İletişim

Başlatan vitruvius, 19 Nisan 2011, 19:11:41

vitruvius

Merhaba, proje olarak bir makete trafik ışıkları koyacağım ve C#'ta yazacağım program ile ışıkların yanma sürelerini girip bunu maketimde uygulamak istiyorum. Ancak seri iletişim ile ilgili en ufak bir bilgim yok. Forumda biraz bakındım ancak pek anladığım söylenemez. Bu arada CCS kullanıyorum demeyelim, öğreniyorum.

Öncelikle sorum bilgisayar ile devre arasındaki bağlantıyı nasıl yapacağım? Rs 232, usb, bluetooth gibi seçenekler duydum. Ancak Rs232 kullanmak için bir de dönüştürücü kullanmak gerekiyor galiba. En kolay iltişimi nasıl sağlarım?

Diğer ve temel sorunum ise bu işin temellerini öğrenerek yapmak istediğim ve başka projeleri gerçekleştirmek istiyorum ama pic'e veri seri port iletişime için rehber kaynak gösterebilir misiniz? İstanbul'da birkaç kitapevine gittim ama C# ile seri port iletişim anlatan kitap bulamadım. I/O aynı ,iletişim, manasına mı geliyor?

Teşekkürler.

yamak

Direkt olarak seri iletişimi anlatan kitap bulman zor. İstediğin tool nasıl kullanıldığını örenmek istiyosan msdn.microsoft.com dan o tool hakkında herşeyi bulabilrsin. Devre ile iletişim kurmak istiyosan da en kolay yöntem bence seri port. Kolay gelsin.

kudretuzuner

Merhaba
Linkte açıklamalar var bir bakıverin lütfen aynı konular işleniyor.Kolay gelsin.
https://www.picproje.org/index.php/topic,33033.msg231466/topicseen.html#msg231466
Amatör

vitruvius

Merhaba çeşitli sorunlardan sonra denemelere başlayabildim. Şimdi basit bir adımla başlayıp sonradan geliştirmek istiyorum. Şuanda Form'a bir adet buton, textbox ve seriport koydum. Yapmak istediğim şey ise textbox'ta yazdığım harfin 16F877'ye bağladığım lcd'de gözükmesi. Devrede sadece 16F877,lcd, max232 ve conn-d9f var. Tabiki ilk denememde başarılı olamadım =) Lcd'de boş ekran gözüküyor. Sorun nerede acaba?

Bir de denemesini nasıl yapmam gerekiyor? Önce Isis'ten simülasyonu başlatıp sonra da yazdığım kod sonucu oluşan .exe yi çalıştırsam direkt algılıyor mu?

Teşekkürler.

C#'ta yazdığım kod:

private void button1_Click(object sender, EventArgs e)
        {
            serialPort1.Open();
            
            string x = textBox1.Text;
            serialPort1.WriteLine(x + (char)13);
            serialPort1.Close();
        }


CCS C'de yazdığım kod:

#include <16f877.h>
#device ADC=10
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#define use_portb_lcd TRUE
#include <lcd.c>
#use rs232 (baud=9600,rcv=PIN_C7, xmit=PIN_C6, parity=N, stop=1) //rs 232 için

void veri()
{
char x[80];
gets(x);
printf(lcd_putc,"\f%s",x);  //LCD'yi temizle ve x string ifadesini LCD'de göster
return;
}

void main()
{
setup_psp(PSP_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);
lcd_init();

 while(1)
  {
    veri();
  }
}

vitruvius

Ayrıca kafama takıldı pic'e iletişimin hangi porttan yapıldığını bildirmek gerekmez mi?

yamak

Dizi kullanmana gerek yok yani veri fonksiyonun içine şu komutları yazabilirsin
void veri(void)
{
 char k;
 k=getc();
if(k=='\n')//c# her cümleyi gönderdiğinde sonuna \n koyuyo
return;
 printf(lcd_putc,"\f%s",x);
}

vitruvius

Dediğinizden yola çıkarak şu şekilde bir kod yazdım:

#include <16f877.h>
#device ADC=10
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#define use_portb_lcd TRUE
#include <lcd.c>
#use rs232 (baud=9600,rcv=PIN_C7, xmit=PIN_C6, parity=N, stop=1) //rs 232 için

void veri(void)
{
char x; 
 x=getc();
if(x=='\n')//c# her cümleyi gönderdiğinde sonuna \n koyuyo
return;
 printf(lcd_putc,"\f%s",x);
}

void main()
{
setup_psp(PSP_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);
lcd_init();

 while(1)
  {
    veri();
  }
}


Sanırım siz k'yı genel bir ifade olarak yazdınız, onun için x ile değiştirdim. Yine lcd boş gözüküyor. Ancak denemeyi doğru yaptığımdan da emin değilim. Isis'te simülasyonu çalıştırıyorum o çalışırken C#'ta yazdığım kod sonucu oluşan .exe dosyasını açıp textbox'a bir harf girip enter'a basıyorum.

yamak

button1 in click olayına yazdığınız için texbox ın içine yazıp button1 e tıklamalısınız

vitruvius

Pardon enter demişim butona tıklıyorum ama bir sonuç alamadım henüz.

yamak

Max232 nin bağlantılarını doğru yaptığınıza emin misiniz?

vitruvius


yamak

Ya bu devrede bi sorun yok.Şu an pek bişey söyleyemeyecm.lcd normalde bişey yazdığınızda düzgün çalışıyo mu?

vitruvius

Veri fonksiyonun içine printf(lcd_putc,"\f   deneme"); yazınca yazı yazmadı. Aynısını main fonksiyonunun içine yazınca yazı çıktı. Veri fonksiyonunda bir yerde mi acaba hatam?

kudretuzuner

Merhaba
Bu tür çalışmalarda PC tarafında TX ten çıkıp tekrar PC'nin RX 'ine girer geri döner ve de yolladığınız datayı görürseniz PC tarafındaki yazılım tamamdır demektir.ikinci aşama PC'nin TX'inden çıktıktan sonra max232'nin R1 in ayağına (pin13)girin.R1 out(pın12)den çıkan ucu T1 in'e girin(pın11)  sonra T2out(pin14) ayağı PC'nin RX'ine girin (tabii max232'nin beslemesini unutmadan ve kondansatörlerin polarizasyonlarını doğru olarak bağlamak şartı ile)Eğer yolladığınız datayı PC'de görürseniz max232 ayağı da tamamdır.Bundan sonra R1out (pın12)'yi PIC'in RX'ine PIC'in TX'ini T1İN(pın11)'e T2out(pın14) rs232'nin RX'ine bağlayın.Tabii daha gelişmiş çalışma birkaç kanallı yüksek frekanslı osiloskop ne girdi ne çıktı görsel olarak da görebilirsiniz.Benim amatör görüşüm böyle en azından ben bu yöntemi uyguluyorum.Kolay gelsin.
Amatör

dumansiz

x=getc();
Bu fonksiyon veri gelene kadar kodu aynı satırda bekletiyor mu?
Bekletmiyorsa; while döngüsü içerisinde LCD ye sürekli bir şey yazdığınızdan veri LCD de görünmüyor olabilir mi?
Bir de C# da kullandığınız serialport nesnesinin özelliklerine baktınız mı? Hızı(9600) ve haberleşme kuralları(8N1) aynı mı?